我的申请结构如下:
Property
与Manager
有很多关系,Unit
与Property
有一对多的关系,即经理可以管理多个属性,一个属性可以有多个经理帐户,一个属性可以有多个单位。
我希望在管理器上有一个HasManyThrough关系来获取他所有的单位,所以理想情况下它看起来像:$manager->units
而不是遍历每个属性并在其上调用$property->units
。这是否可以使用当前版本的laravel?
管理器:
属性:
managers_properties:
单元
答案 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->units
个Collection
模型,这种格式与您从多对多关系方法的魔法访问器中获得的格式相同。但是Unit
不是一个实际的关系方法(它不会返回关系对象),因此不能将其视为这样,而getUnitsAttribute()
可以是。