在我的控制器中,我得到一个复杂的查询,该查询根据用户提供的输入来过滤数据:
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
可以,但是如果我的$myObject
有relationC
而不是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时,它将加载它以检查条件是否存在。
如何避免呢?还是有另一种方法可以检查关系是否存在我的对象项,而无需执行其他查询?
答案 0 :(得分:1)
如果要检查是否已加载关系,可以在模型上使用relationLoaded()
方法:
@if ($myObject->relationLoaded('relationB')) {
<span>{{ $myObject->relationB->someField }}</span>
@else
<span>{{ $myObject->relationC->someField }}</span>
@endif