2017-08-24 119 views
1

访问多个远程模型我有三个型号在Laravel 5.4 - 更新

Photo 
-id 
-path_full 
Person 
-id 
-name 
Face 
-id 
-person_id //was people_id 
-photo_id 

我想从照片模式访问的人的名字。
面模型:

public function photo() 
{ 
    return $this->belongsTo(Photo::class); 
} 

public function person() 
{ 
    return $this->belongsTo(Person::class); 
} 

照片型号:

public function faces() 
{ 
    return $this->hasMany(Face::class); 
} 

角色模型:

public function faces() 
{ 
    return $this->hasMany(Face::class); 
} 

在我控制我加载照片是这样的:

$photos = Photo::with('faces')->paginate(); 

在我的刀片模板中,我想访问照片中的人脸名称。 我明白了这一点。
这是在foreach因此奇异$照片:

{{implode($photo->faces->pluck('people_id')->toArray(),', ')}} 

我怎样才能得到,而不是人的名字?

解决方案
我需要这在我看来并注意我改变了分贝PERSON_ID如此雄辩可以做它的魔力。

//Controller: 
$photos = Photo::with('faces.person')->paginate(); 

//View: 
@foreach($photo->faces as $face) 
     {{$face->person['name']}} 
@endforeach 
+0

这不是一个多对多的关系吗? –

+0

脸部是特定照片中的独特脸部,因此它总是属于单张照片。这从面部识别。一个人在许多照片中可以有许多面孔。一张脸只能属于一个人。 – BobB

+0

所以,你想要拍一张照片,然后是每张脸的人名? –

回答

2

可以急于负载person数据你对照片的模型调用faces时间

// Photo.php 
public function faces() 
{ 
    return $this->hasMany(Face::class)->with('person'); 
} 

或者在您的查询,你只能在那做是为了急于负载时间

$photos = Photo::with('faces', 'faces.person')->paginate(); 

现在您可以像这样访问:

$photos->first()->faces->first()->person->name; // will print the name of the person of the first face of the first photo... 

我希望这个答案能够有所帮助。

+0

当I DD($光电>面)我得到这样的:收集{#355▼ #items:阵列:1 [▼ 0 =>脸部{#376▼ #table: “面” #attributes:数组:13 [▼ “ID”=> 181 “photo_id”=> 16 “people_id”=> 1 ] #relations:阵列:1 [▼ “人”=>空 ] } ] }注意人员为空。 – BobB

+0

感谢您的帮助。我的问题是people_id应该是person_id。 Laravel的模型名称不是表名 – BobB

+0

很棒的@BobB,我认为如果你更新你的问题会很有帮助。 –

0

尝试通过改变您的查询像这样得到的脸的人:

Photo::with(['faces' => function($query) {$query->with('person')}])->paginate(); 

我不太清楚有关语法,但是这是一个雄辩的模型,你可以嵌套关系如何。一个更短的方式来写这可能是:Photo::with('faces.person')->paginate();

提供了一些更多的信息here