gpt4 book ai didi

laravel - hasManyThrough 带有中间数据透视表

转载 作者:行者123 更新时间:2023-12-04 23:38:39 25 4
gpt4 key购买 nike

描述:

我的应用程序结构如下:PropertyManager 有多对多关系, 和 UnitProperty 有一对多关系,即一个经理可以管理多个属性,一个属性可以有多个经理帐户,一个属性可以有多个单元。

我想在经理上建立一个 HasManyThrough 关系来获取他的所有单位,所以理想情况下它看起来像:$manager->units而不是通过遍历每个属性并调用 $property->units在上面。当前版本的 Laravel 可以做到这一点吗?

表格:

经理:

  • id

  • 特性:
  • id

  • manager_properties:
  • manager_id
  • property_id

  • 单位:
  • id
  • property_id
  • 最佳答案

    Eloquent 目前没有链接关系的方法,除了 hasManyThrough ,仅适用于 2 个链接的 hasMany关系。您应该创建自己的实现来获取相关资源。最简单的方法是定义一个 accessorManager模型:

    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返回给您 CollectionUnit模型,这种格式等同于您从一对多关系方法的魔法访问器中获得的格式。然而 getUnitsAttribute()不是一个实际的关系方法(它不返回关系对象),所以不能这样处理,而 Manager::properties()可。

    关于laravel - hasManyThrough 带有中间数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46391799/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com