我正在使用Laravel v4.1 ...是的,我知道它很旧。我的问题是如何建立模型并着手获取与两个枢纽分析表关联的“两个”级别的相关模型。
例如...
我的数据库表:
第一:
id name
== =============
1 lorem
2 ipsum
秒:
id name
== =============
3 dolor
4 sit
三分之二:
id name
== =============
5 amet
6 consectetur
7 adipiscing
8 elit
第一秒:
first_id second_id
======== =========
1 3
2 4
second_third :
second_id third_id
========= ========
3 5
3 6
4 7
4 8
如果 FirstModel 为1,那么我想从 ThirdModel 中获取以下内容:
id name
== =============
5 amet
6 consectetur
我可以做到一个级别(即, SecondModel )。关于如何为 ThirdModel 做到这一点的任何想法?
答案 0 :(得分:0)
根据4.1中的文档,有很多方法可以通过,因此您可以尝试以下方法:
class FirstModel extends ModelAbstract
{
public function seconds()
{
return $this->belongsToMany(SecondModel::class);
}
public function thirds()
{
return $this->hasManyThrough(ThirdModel::class, SecondModel::class);
}
}
class SecondModel extends ModelAbstract
{
public function thirds()
{
return $this->belongsToMany(ThirdModel::class);
}
}
class ThirdModel extends ModelAbstract {}
然后像这样从第一个关系中获取第三个关系的数据:
$first = FirstModel::find(1);
$thirds = $first->thirds;
如果这不起作用,则可以按照旧的方式进行操作,从关系中收集所有第三项ID,然后手动查询:
$first = FirstModel::with(['seconds.thirds'])->find(1);
$thirdIds = $first->seconds->map(function ($item) {
return $item->thirds->pluck('id')->toArray();
})->toArray();
$thirds = ThirdModel::whereIn('id', array_flatten($thirdIds));
答案 1 :(得分:0)
@thefallen,
不确定为什么第一种方法和第二种方法都不适合我。我最终选择了两者的混合体并加上一些额外的循环。不是最干净/最漂亮,但是可以完成工作。
$results = [] ;
$id = 1 ;
$first = FirstModel :: with( [ 'seconds.thirds' ] ) -> find( $id ) ;
$seconds = $first -> seconds -> map( function ( $item ) {
return $item -> thirds ;
} ) -> toArray() ;
foreach ( $seconds as $item1 ) {
foreach ( $item1 as $item2 ) {
$results[ $item2[ 'id' ] ] = $item2[ 'name' ] ;
}
}