只有first()适用于嵌套关系

时间:2013-12-03 21:37:29

标签: php laravel laravel-4

我无法从一组模型中访问嵌套关系。如果我使用first(),我可以访问该特定模型的关系。例如......

public function movie($id)
{
    $member = Movie::find($id)->cast()->first()->person;

    return View::make('movie')->with(array(
        'data' => $member
    ));     
}

在这种情况下,echo $data会形成{"person_id":"10255","name":"Paul Benedict"}之类的结果。那很好但是如果我尝试做类似的事情......

$cast = Movie::find($id)->cast;

return View::make('movie')->with(array(
    'data' => $cast
));

如果在我看来,我会尝试打印出每个人......

foreach ($data->person as $member) {
    echo $member;
}

我收到以下错误:

Undefined property: Illuminate\Database\Eloquent\Collection::$person

我到底做错了什么,我该怎么做?

Follow on from previous question

1 个答案:

答案 0 :(得分:1)

好久不说话! :)我将逐步完成这一步(同样为了我自己的理解)

首先,在这种情况下,我们采取以下步骤:

$member = Movie::find($id)->cast()->first()->person;
  1. Movie::find($id)->cast() - 此处我们有CollectionMovieCast个对象。
  2. ->first() - 我们接受第一个MovieCast和......
  3. ... ->person - 我们接受与Person对象关联的MovieCast对象。
  4. 现在,我们在$ member变量中有一个Person对象的实例。也许他有一个名字或一些其他属性(created_atmodified_atage,等等。

    让我们看看另一个案例:

    $cast = Movie::find($id)->cast;
    

    此处我们MovieCast变量中只有Collection$cast个对象。当我们遍历此Collection时,我们将返回MovieCast对象的实例。

    因此,我们需要循环遍历这些对象(在movie视图中):

    // I've used the same $data variable as you're defining in your Controller.
    @foreach($data as $d)
    
        // each $d is a MovieCast object, so you can access his ->person() method.
        <pre>{{ $d->person->name }}</pre>
    
    @endforeach
    

    问题在于,通过在foreach中运行->person,您正在针对Collection对象运行它,而Collection对象没有person()方法;因此错误!

    这有意义吗?