Laravel Eloquent:检索"第二级"关系实体

时间:2018-04-12 07:42:02

标签: php laravel eloquent

我是3实体:

Owner
-id

Car
-id
-owner_id
-brand_id

Brand
-id

我想检索brand cars的所有owner

现在,如果我在Owner班级

$this->cars()->with('brand');

我收到Database/Eloquent/Collection这样的内容:

Illuminate\Database\Eloquent\Collection {
    all: [
        App\Car {
            id: 1,
            owner_id: 10,
            brand_id: 100,
            brand: App\Brand {
                id: 100
            },
        },
        App\Car {
            id: 2,
            owner_id: 10,
            brand_id: 200,
            brand: App\Brand {
                id: 200
            },
        },
        App\Car {
            id: 3,
            owner_id: 10,
            brand_id: 100,
            brand: App\Brand {
                id: 100
            },
        },
    ],
}

但我希望有这样的结构:

Illuminate\Database\Eloquent\Collection {
    all: [
        App\Brand {
            id: 100
        },
        App\Brand {
            id: 200
        },
}

有可能以某种方式吗?

2 个答案:

答案 0 :(得分:1)

您可以在hasManyThrough型号上使用Owner关系。

例如:

public function brands()
{
    return $this->hasManyThrough(Brand::class, Car::class);
}

答案 1 :(得分:0)

有两种选择,

  • 您可以使用Eloquent Collections的功能并过滤/映射您的对象,将其转换为您想要的形式。
  • 您可以使用hasManyThrough在模型上定义另一种关系。

简单示例(您可能需要将列名设置为参数。);

public function brands() { 
     return $this->hasManyThrough(Brand::class, Car::class);
}

你也可以使用belongsToMany,如果你的二级表上没有外键(听起来不太好,但它有效)。

请注意,第二个参数应替换为Car table的名称。

public function brands(){
    return $this->belongsToMany(Brand::class, 'cars', 'owner_id', 'brand_id');
}