NetteDB a testování existence vazby has one

mnovy
Člen | 5
+
0
-

Ahoj,
řeším rozdílné chování detekce existence vazby has one u php 5.6 a 7.0.

Mám několik tabulek, které mají mezi sebou relaci has one.

tableA → tableB → tableC

Pro detekci hodnoty sloupce columnX v tabulce tableC pro konkrétní záznam z tabulky tableA používám následující kód:

<?php
$row = $this->table_a_model->get($id)->fetch();
...
if (isset($row->tableB->tableC->columnX) then {
	...
}
?>

V php 5.6 to funguje bez problémů správně, v php 7.0 se to chová jinak. Hledal jsem v dokumentaci a našel testování s využitím, že metoda ref() vrací instanci ActiveRow nebo null:

<?php
if ($book->translator) {
    echo ' (translated by ' . $book->translator->name . ')';
}
?>

A podmínku upravil na

<?php
$row = $this->table_a_model->get($id)->fetch();
...
if ($row->tableB->tableC) then {
	...
}
?>

jenže to zase vyhazuje pod php 7.0 E_NOTICE: Trying to get property of non-object.

Prosím o radu, jak správně detekovat existenci relace has one přes více tabulek za sebou? Psaní $row->tableB && $row->tableB->tableC se mi nelíbí. Děkuji

Používám Nette\Databbase v poslední verzi.

mnovy
Člen | 5
+
0
-

Přišel jsem na to, že různě volají magické metody __get a __isset.

Pod php 5.6 se volá __get('tableB') ... __isset('columnX') a pod php 7.0 __isset('tableB').

mnovy
Člen | 5
+
0
-

Tak jsem založil bug s příklady i návrhem řešení.

Editoval mnovy (16. 4. 2018 16:54)