我有模型A,B和C.与B和B的hasOne关系与C有很多关系。
//Model Code
class A extends Model
{
//This relates A and B
public function relateBC(){
return $this->hasOne('App\B','aid','aid');
}
}
class B extends Model
{
//Inverse relationship with Model A
public function relateBC(){
return $this->belongsTo('App\A','aid','aid');
}
//This relates B and C
public function relateBC(){
return $this->hasMany('App\C','bid','bid');
}
}
class C extends Model
{
//Inverse relationship with Model B
public function post(){
return $this->belongsTo('App\B','bid','bid');
}
}
下面的代码返回来自Model B的数据
App\A::find(id)->relateAB()->get();
下面的代码返回来自Model C的数据
App\B:find(id)->relateBC()->get();
以下代码抛出BadMethodException。方法relatedBC()不存在。
App\A::find(id)->relateAB->relateBC()->get();
。
答案 0 :(得分:0)
试试这个:
$distantRelations = App\A::find($id)->relateAB->relateBC;
当作为方法(即->relateAB()
)进行访问时,您将返回HasOne relationship object(您可以调用->get()
的对象),而当作为魔术属性访问时(即 - > relatedAB),您可以返回模型实例(您可以访问关系relateBC
的对象)。
你可能使用该方法而不是magic属性,但请记住,您必须确定关系类型(一对多),并调用{{分别在基础查询构建器上添加1}}或->get()
:
->first()
$distantRelations = App\A::find($id)
// 'relateAB' is a singular relation,
// so we'll need to call 'first()'
->relateAB()->first() // > App\B
// 'relateBC' is a 'many' relation,
// so we'll need to call 'get()'
->relateBC()->get(); // > App\C[]|\Illuminate\Support\Collection
致电HasOne
您可以在查询构建器at this line上见证first()
为您调用HasOne
,通过将关系作为魔法属性来执行。
first()
致电HasMany
您可以在查询构建器at this line上见证get()
为您调用HasMany
,通过将关系作为魔法属性来执行。
答案 1 :(得分:0)
在数据透视表中声明A模型和B模型的主键,即作为两个表的外键