Eloquent关系在视图中无法正常工作,除非使用dd()函数。
Eloquent关系在视图中无法正常工作,除非使用dd()函数。
参考:Laravel Eloquent关系:不是对象时做任何事情, 除了dd()
我试图在Blade中输出Laravel的关系。然而,这个{{ $video->channel->id }}
返回一个非对象错误。但是,当像这样{{ dd($video->channel->id) }}
一样dd
时,有一个值。我因此掉了头发...发生了什么?为什么只有在dd
变量时才有输出?
我正在使用PHP 7.2和Laravel 5.6进行测试。按照Eloquent文档建立关系。我尝试像这样提取数据:
$videos = Video::where(\'foo\', \'bar\')->with(\'channel\')->take(100)->get();
和
$videos = Video::where(\'foo\', \'bar\')->take(100)->get();
同样的事情;相同的输出/错误。
$tokens = preg_split("/[\s,]+/", $q); $videos = Video::with('channel') ->where(function ($query) use ($tokens) { foreach ($tokens as $token) { $query->orWhere('title', 'LIKE', "%$token%"); } }) ->take(100) ->get();
// foreach ($videos as $video) {{ $video->channel->id }} // non-object error {{ dd($video->channel->id) }} // WORKS! IDK Why...
尝试获取非对象的“id”属性
是实际的错误日志。
编辑:
以下是从数据库获取的$videos
集合的图像。
如果在dd()
中,某些东西被正确输出,我只能假设我正确提取了数据,对吧?
当在循环中执行这个操作时,出现错误
Trying to get property 'id' of non-object
意味着在 $video->channel
的某一次迭代中,返回了一个非对象(很可能是 null
),并且你不能访问它的属性 ->id
(因为 null
没有任何属性等)
dd()
起作用的原因是它在第一次迭代中 dump 并且停止了,这个迭代有一个 channel。为了解决这个问题,简单地添加一个 @if()
条件:
@foreach($videos AS $video) @if($video->channel) {{ $video->channel->id }} @else ... @endif ... @endforeach
或者,在获取 $videos
的查询中强制关联关系:
$videos = Video::where('foo', 'bar')->has('channel')->with('channel')->take(100)->get();
这样,$video->channel
就不会是 null
了。