请考虑以下情形: 我有一个名为Order的Eloquent模型,它有一个Line Item和一个Line Item Totals定义如下(问题简化):
class Order extends Eloquent {
public function lineitem() {
return $this->hasOne('App\Models\LineItem','id','lineitem_id');
}
}
class LineItem extends Eloquent {
public function totals() {
return $this->hasMany("App\\Models\\LineItemTotal",'lineitem_id');
}
}
当我执行dd($order->lineitem->totals)
时,我正确地收到了数据:
Collection {#530 ▼
#items: array:7 [▼
0 => LineItemTotal {#506 ▶}
1 => LineItemTotal {#531 ▶}
2 => LineItemTotal {#522 ▶}
3 => LineItemTotal {#508 ▶}
4 => LineItemTotal {#509 ▶}
5 => LineItemTotal {#510 ▶}
6 => LineItemTotal {#511 ▶}
]
}
然而,当我表演时:
dd(isset($order->lineitem->totals));
我收到:
false
这真的让我大吃一惊,到目前为止,我的猜测是,在整个过程的某处,有一个受保护的属性阻止isset()
或empty()
访问它,从而返回false
(虽然这两种方法都被定义为公开的。)
知道为什么会发生这种情况以及如何解决这个问题?一个人认为我喜欢用魔法覆盖isset()
,但我希望能有一个更清洁的解决方案。
答案 0 :(得分:0)
当isset()返回false时,由于空值查找,在“lineitem”或“totals”(关系)中查找时可能会出错。
解决方案是将它们分开并放入try catch异常
// part 1
try {
$lineitem = $order->lineitem;
} catch (Exception $e) {
$lineitem = [];
}
// part 2
try {
$totals = $lineitem->totals;
} catch (Exception $e) {
$totals = [];
}
dd($totals);