Eloquent关系在视图中无法正常工作,除非使用dd()函数。

8 浏览
0 Comments

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()中,某些东西被正确输出,我只能假设我正确提取了数据,对吧?

\"enter

admin 更改状态以发布 2023年5月23日
0
0 Comments

当在循环中执行这个操作时,出现错误

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 了。

0