【问题标题】:Laravel 4 Eager Loading "Undefined Property"Laravel 4急切加载“未定义的属性”
【发布时间】:2013-07-18 21:22:28
【问题描述】:

为什么我无法在急切加载的场景中访问该属性?

我正在尝试访问我的设施模型的照片位置。他们有很多:很多的关系。当我使用

加载设施信息时
$facilities = Facility::with('photos')->get();

当我尝试访问时

foreach($facilities as $facility)
{
    echo $facility->photos->id;
}

我收到了Undefined property: Illuminate\Database\Eloquent\Collection::$id

如果我回显$facilities->photos,我最终会得到。

[{"id":"3",
"name":null,
"location":"facilities\/facility1.jpg\r",
"created_at":"2013-07-18 14:15:19",
"deleted_at":null,
"updated_at":null,
"pivot":{"facility_id":"5","photo_id":"3"}}]

访问此数组中任何属性的最佳方式是什么?

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    通过预先加载photos,您将获得一个photos 集合,为了获得照片,您需要遍历photos 集合,例如

    foreach($facilities as $facility)
    {
    
     foreach($facility->photos as $photo)
     {
        echo $photo->id;
     }
    
    }
    

    如果您只想要第一张照片,您可以通过在集合上调用 first() 方法来获取它

    foreach($facilities as $facility) 
    {
      $facility->photos->first()->id;
    }
    

    【讨论】:

    • $facility->photos()->first()->id; 应该是 $facility->photos->first()->id;(照片上没有括号)。
    【解决方案2】:

    从数据库接收到的是一个包含一个对象的数组。这就是为什么 foreach 起作用的原因。要以您想要的方式访问它,您应该添加 first() 方法,就像 Atrim 所说的那样,您甚至可以删除 get() 方法。只有我建议在控制器中执行此操作。

    $facilities = Facility::with('photos')->first();
    
    {{ $facilities->location }}
    

    【讨论】:

      【解决方案3】:

      感谢 Altim,我也遇到了这个问题,嵌套的 foreach 就是解决方案之一。 不过,我还是把我最后使用的解决方案分享给大家。

      我没有使用嵌套的 foreach 甚至是 Eager loader,而是使用了 Join Query Builder。就我而言:

      $posts = DB::table('posts')
                      ->leftJoin('users', 'posts.user_id', '=', 'users.id')
                      ->get();
      

      这允许我使用一个 foreach,并且所有数据都处于同一级别,例如,在我的情况下会是这样的:

      @foreach ($posts as $post)
        <p>{{ $post->first_name }}</p> # From users table
        <p>{{ $post->title }}</p> # From posts table
        <p>{{ $post->body }}</p>
      @endforeach
      

      也许它没有准确回答这个问题,但希望它对像我这样最终解决这个特定问题的其他人有所帮助。

      【讨论】:

      • 如果有人知道在没有查询构建器的情况下进行干净的左连接的方法,以更 laravel 的方式,我很想知道 ;)
      猜你喜欢
      • 2014-08-13
      • 2017-03-31
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多