hasManyThrough具有中间数据透视表

时间:2017-09-24 15:36:50

标签: laravel laravel-5 eloquent

说明

我的申请结构如下: PropertyManager有很多关系,UnitProperty有一对多的关系,即经理可以管理多个属性,一个属性可以有多个经理帐户,一个属性可以有多个单位。

我希望在管理器上有一个HasManyThrough关系来获取他所有的单位,所以理想情况下它看起来像:$manager->units而不是遍历每个属性并在其上调用$property->units 。这是否可以使用当前版本的laravel?

表:

管理器:

  • ID

属性:

  • ID

managers_properties:

  • manager_id
  • PROPERTY_ID

单元

  • ID
  • PROPERTY_ID

1 个答案:

答案 0 :(得分:7)

Eloquent目前没有链接关系的方法,除let locations = try! JSONDecoder().decode(Array<LocationModel>.self, from: data) 之外,只适用于2个链式let queue = DispatchQueue.global(qos: .userInteractive) queue.async{ ... 关系。您应该创建自己的实现来获取相关资源。最简单的方法是在hasManyThrough模型上定义accessor

hasMany

您现在应该能够使用Manager假设namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Support\Collection; /** * @property-read Collection|\App\Models\Property[] $properties * @property-read Collection|\App\Models\Unit[] $units */ class Manager extends Model { public function properties(): BelongsToMany { return $this->belongsToMany(Property::class); } public function getUnitsAttribute(): Collection { return $this->properties ->pluck('units') ->flatten(1) ->unique('id') ->sortBy('id'); } } 来访问相关单位。

注意

调用$manager->units 执行大多数$manager instanceof App\Models\Manager数据库查询:$manager->units用于获取n + 1相关属性,另一个1用于获取每个返回属性的相关单位。 “最多”,因为之前调用访问者可能已经加载了资源。

注意

调用n会返回n $manager->unitsCollection模型,这种格式与您从多对多关系方法的魔法访问器中获得的格式相同。但是Unit 是一个实际的关系方法(它不会返回关系对象),因此不能将其视为这样,而getUnitsAttribute()可以是。