Trying to get property of non-object při ref() – Nette/Database

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
AuHau
Člen | 13
+
0
-

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}
...
vvoody
Člen | 910
+
0
-

t_reports.eid nemáš NOT NULL, takže keď ho nemáš nastavený v niektorom reporte, tak ti to zareve, kedže ref vráti len NULL

AuHau
Člen | 13
+
0
-

Chápu tvůj point a ano máš pravdu, každopádně to teď neni můj problém. U toho t_reports.eid mi to neřve, ale u t_reports.id_state (ten BTW má NOT NULL)…

Resp. v Laděnce mám označený řádek s id_state a když ten řádek zakomentuju, tak všechno jede OK…

vvoody
Člen | 910
+
0
-

Nestalo sa ti toto po nejakom znovu nahodení databázy z sql dumpu? Môže byť rozbitá konzistencia. Dumpni si $report->id_state a chod to inkriminované posledné IDčko, na ktorom to spadne, ručne pohľadať do tabuľky c_state aby bolo isté že ten riadok v tabuľke existuje.

AuHau
Člen | 13
+
0
-

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…

vvoody
Člen | 910
+
+1
-

Vidíš to ma ani nenapadlo a to som sa s týmto problémom stretol nedávno keď som niekomu pomáhal so školským projektom. Neviem či to je naschvál, asi nie ale id = 0 je veľmi atypické, radšej to prekop tak aby ten FK mohol byt NULL a kontroluj čo vracia ref.

AuHau
Člen | 13
+
0
-

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