如何使用方法链从Laravel Eloquent中的远程关系模型中检索数据?

时间:2017-09-02 17:17:03

标签: laravel eloquent laravel-5.4

我有模型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();    

2 个答案:

答案 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模型的主键,即作为两个表的外键