Laravel-刀片检查对象是否有关系

时间:2019-05-29 17:15:05

标签: php laravel laravel-5.8

在我的控制器中,我得到一个复杂的查询,该查询根据用户提供的输入来过滤数据:

if (conditionB) {
   $query = Model::with('relationA', 'relationB');
} else {
   $query = Model::with('relationA', 'relationC');
}

// checking filters and apply conditions...

$query = $query->get();

现在在我的刀片文件中,我正在循环显示结果,我想显示“紧急负载”关系B或C:

@if (count($myObject->relationB)) {
    <span>{{ $myObject->relationB->someField }}</span>
@else
    <span>{{ $myObject->relationC->someField }}</span>
@endif

可以,但是如果我的$myObjectrelationC而不是relationB,则 在验证if条件时,将加载该关系。

我如何避免加载这种关系?

当我这样做时:{{ $myObject }}

它给了我

   // has relationB
   "field1": value1,
   "field2": value2,
    ....
   "fieldx": valuex,
   "relation_b":[  
      { 
         "relationBfield1": relationBvalue1,
         "relationBfield2": relationBvalue2,
      },
      { ... }

   // doesn't have relationB
   "field1": value1,
   "field2": value2,
    ....
   "fieldx": valuex

我尝试访问access_b(请注意json通过将UpperCase替换为_<LowerCase>来更改名称),但它返回NULL,但是如果我访问RelationB,它将显示数据:

myObject->relation_b; // NULL
myObject->relation_b[0]; // NULL
myObject->relationB; // works, but if item has RelationC it will "eager load" relationship B just to check that if condition

我尝试了不同的选择,但看不到哪里出错了,我还尝试在模型中创建一个public function

{{ $myObject->checkRelation() }}

public function checkRelation()
{
    if (count($this->relationB) > 0) {
        // code...

但是我总是会遇到同样的问题,当对象项没有关联B时,它将加载它以检查条件是否存在。

如何避免呢?还是有另一种方法可以检查关系是否存在我的对象项,而无需执行其他查询?

1 个答案:

答案 0 :(得分:1)

如果要检查是否已加载关系,可以在模型上使用relationLoaded()方法:

@if ($myObject->relationLoaded('relationB')) {
    <span>{{ $myObject->relationB->someField }}</span>
@else
    <span>{{ $myObject->relationC->someField }}</span>
@endif