Laravel总是在嵌套关系上返回false

时间:2016-02-10 04:17:20

标签: laravel-5 eloquent isset

请考虑以下情形: 我有一个名为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(),但我希望能有一个更清洁的解决方案。

1 个答案:

答案 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);