Trying to get property of non-object při ref() – Nette/Database
- AuHau
- Člen | 13
Ahojte,
prosím, prosím pomocte zoufalci.
Používám Nette Database (snad korektním způsobem) a z nenadání mi začal
vyskakovat error Trying to get property of non-object
na všech
stránkách kde se pomocí ref()
odkazuju na jednu jedinou tabulku.
Zkoumal jsem to a podle mého je problém v cachování, ale teda nemám páru
co dělám blbě, jelikož stejné použití metody u jiných tabulek neni
problém.
Ze začátku když jsem vymazal cache a šel jsem na čerstvou stránku, tak se
jednou zobrazila, ale po druhém načtení zase přestala fungovat :(
Dávám příklad jedné stránky na které mi to vyhazuje. Problémová tabulka je c_state.
CREATE TABLE c_state
(
id_state serial NOT NULL,
name character varying NOT NULL,
background_color character varying,
CONSTRAINT c_state_pkey PRIMARY KEY (id_state)
)
CREATE TABLE t_reports
(
id_report serial NOT NULL,
uid integer NOT NULL,
id_person integer NOT NULL,
eid integer,
id_state integer NOT NULL DEFAULT 0,
date timestamp without time zone NOT NULL,
content text,
summary character varying NOT NULL,
motivation character varying,
cid integer NOT NULL,
CONSTRAINT t_reports_pkey PRIMARY KEY (id_report),
CONSTRAINT t_reports_cid_fkey FOREIGN KEY (cid)
REFERENCES t_companies (cid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT t_reports_eid_fkey FOREIGN KEY (eid)
REFERENCES t_events (eid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT t_reports_id_person_fkey FOREIGN KEY (id_person)
REFERENCES t_contact_persons (id_person) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT t_reports_id_state_fkey FOREIGN KEY (id_state)
REFERENCES c_state (id_state) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT t_reports_uid_fkey FOREIGN KEY (uid)
REFERENCES t_users (uid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE t_companies
(
sys_uid integer NOT NULL,
sys_date timestamp without time zone NOT NULL DEFAULT now(),
cid serial NOT NULL,
name character varying NOT NULL,
url character varying,
description text,
address character varying,
active boolean NOT NULL DEFAULT true,
oid integer NOT NULL,
CONSTRAINT t_companies_pkey PRIMARY KEY (cid),
CONSTRAINT t_companies_oid_fkey FOREIGN KEY (oid)
REFERENCES t_orgs (oid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT t_companies_sys_uid_fkey FOREIGN KEY (sys_uid)
REFERENCES t_users (uid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
Presenter
public function renderShow($id) {
// Vrací $db->table('t_companies')->get($id)
$this->template->company = $this->repo->findById($id);
}
Šablona
...
{foreach $company->related('t_reports')->order('date ASC')->limit(15) as $report}
<tr>
<td><a n:href="Person:show $report->id_person">{$person->title} {$report->ref('id_person')->name} {$report->ref('id_person')->surname}</a></td>
<td>{$report->ref('uid')->name} {$report->ref('uid')->surname}</td>
<td> <i>{$report->date|date:'G:i'}</i> {$report->date|date:'j.n.Y'}</td>
<td><a n:href="Events:show $report->eid">{$report->ref('eid')->short_name ?: $report->ref('eid')->name}</a></td>
<td>{$report->ref('id_state')->name}</td>
<td>{$report->summary}</td>
<td><a n:href="Reports:show $report->id_report"><i class="icon-search"></i></a>
<a n:href="Person:edit $report->id_report"><i class="icon-pencil"></i></a>
<a n:href="Person:delete $report->id_report"><i class="icon-trash"></i></a></td>
</tr>
{/foreach}
...
- AuHau
- Člen | 13
Tyjo hmmm!
Žádný dump databáze jsem nedělal, svým způsobem jsem nějak nedokázal
odhadnout kdy se to spustilo, každopádně jsi mi vnuknul jeden nápad a tak
jsem zkoušel a zkoušel a asi jsem na to přišel!
V tabulce c_state mám totiž jeden speciální řádek, který má ID 0. Speciální je proto, že celá aplikace je naučená tento řádek ignorovat, jelikož znamená že neproběhla žádná změna při tom reportu. Tak jsem si myslel, že ho chci mít odlišný od normálních id_state, proto jsem mu dal to id_state = 0.
V databázi mám zatím pouze jeden report, kde jsem dal id_state = 0 a když změním na nenulový id_state, tak to jede!
Neni to bug? Resp. tak trochu intuitivně asi chápu, že díky tomu, že se
do toho ref()
dostane 0, tak si asi myslí, že byl neúspěšný
při získání dat (FALSE?) a tedy nenatáhne dané informace. Ale řádek
s takovým ID je v DB! Nebo je to proti konvencím, které se musí
dodržovat?
Připouštím, že je to trochu atypické, avšak očekával bych, že to bude fungovat, jelikož záznam v DB je…
- AuHau
- Člen | 13
Dík moc za pomoc! :)
Udělal jsem to tak no, překopal jsem aplikaci a to special ID je teď 1.
Můžeš mi prosím ještě pomoc s jiným problémem?
Viz.: https://forum.nette.org/…kym-sloupcum