目前在Laravel中处理一个非常基本的三个表/模型问题,并且正确的Eloquent设置使我不知所措。

收集-> coll_id,...

项目-> item_id,coll_id,type_id,...

TYPE-> type_id,...

我可以用一千种方法来表述,但不能开始概念化适当的口才关系:

集合有很多项目,每个项目都有一个类型。或者,一个ITEM属于单个COLLECTION,而TYPES与许多ITEMS相关联。

对我来说,COLLECTION和ITEM是关键,而TYPE实际上是给定ITEM上的其他参考数据。基本上是该商品的类别。

我的目标是建立一个解决方案,其中用户创建集合,将ITEMS添加到这些COLLECTIONS中,并且这些ITEMS与许多TYPES(他们也将定义)之一相关联。

我知道这个例子离其他作者,书籍,类别并不远。或城市,州,国家/地区示例,但实现这些模型框架并不能建立来自COLLECTION ITEM TYPE的完整连接,并且最明显的是在尝试将COLLECTION中的TYPES关联时失败。

楷模:

采集

class Collection extends Model
{
    protected $guarded = [];

    public function items()
    {
        return $this->hasMany(Item::class);
    }

    public function types()
    {
        return $this->hasManyThrough(Type::class, Item::class);
    }

}


项目

class Item extends Model
{
    public function collection()
    {
        return $this->belongsTo(Collection::class);
    }

    public function type()
    {
        return $this->belongsTo(Type::class);
    }
}


类型

class Type extends Model
{
    public function item()
    {
        return $this->hasMany(Item::class);
    }

}


这些模型在两个方向上的COLLECTION ITEM都运作良好,但是当我尝试集成TYPE时,轮子掉落了。根据我尝试的1000个变体,我要么在Tinker中得到NULL,要么正在TYPE中寻找一个ITEM_ID,该ID不存在也不应该存在。

更新模型以准确反映在一个COLLECTION中具有一个TYPE和最终一组TYPES的ITEMS的解决方案是什么?

提前致谢!



更新:有效的嵌套解决方案-主要响应解决方案在COLLECTION中显示2个关系,无嵌套:

class Collection extends Model
{
    protected $guarded = [];

    public function items()
    {
        return $this->hasMany(Item::class);
    }


class Item extends Model
{
    public function collection()
    {
        return $this->hasOne(Collection::class);
    }

    public function type()
    {
        return $this->belongsto(Type::class);
    }
}


class Type extends Model
{
    public function items()
    {
        return $this->hasMany(Item::class);
    }
}


$collection->load('items.type');

        dd($collection);


Collection {#280 ▼
  #guarded: []
  #connection: "mysql"
  #table: "collections"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:5 [▶]
  #original: array:5 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  **#relations: array:1** [▼
    "items" => Collection {#285 ▼
      #items: array:2 [▼
        0 => Item {#288 ▼
          #connection: "mysql"
          #table: "items"
          #primaryKey: "id"
          #keyType: "int"
          +incrementing: true
          #with: []
          #withCount: []
          #perPage: 15
          +exists: true
          +wasRecentlyCreated: false
          #attributes: array:13 [▶]
          #original: array:13 [▶]
          #changes: []
          #casts: []
          #dates: []
          #dateFormat: null
          #appends: []
          #dispatchesEvents: []
          #observables: []
          **#relations: array:1** [▼
            "type" => Type {#296 ▶}
          ]
          #touches: []
          +timestamps: true
          #hidden: []
          #visible: []
          #fillable: []
          #guarded: array:1 [▶]
        }
        1 => Item {#289 ▶}
      ]
    }
  ]

最佳答案

HasManyThrough不是Collection与Type之间的正确关系。 HasManyThrough有点像将2个HasMany关系链接在一起:

Country -> State -> City


请注意,箭头全都向一种方向移动。这是因为City对State具有外键,而State对Country具有外键。

您的关系如下所示:

Collection -> Item <- Type


因此,Item具有集合和类型的外键。在这种情况下,Collection和Type之间的关系实际上是BelongsToMany,而Item表是联接表。

https://laravel.com/docs/5.8/eloquent-relationships#many-to-many

class Collection extends Model
{
    protected $guarded = [];

    public function items()
    {
        return $this->hasMany(Item::class);
    }

    public function types()
    {
        // Substitute your table and key names here
        return $this->belongsToMany(Type::class, 'items_table', 'coll_id', 'type_id');
    }

}

class Type extends Model
{
    public function items()
    {
        return $this->hasMany(Item::class);
    }

    public function collections()
    {
        // Substitute your table and key names here
        return $this->belongsToMany(Collection::class, 'items_table', 'type_id', 'coll_id');
    }

}

class Item extends Model
{
    public function collection()
    {
        return $this->belongsto(Collection::class);
    }

    public function type()
    {
        return $this->belongsto(Type::class);
    }
}


如果要获取包含其项目以及每个项目下的相应类型的集合,可以执行以下操作:

Collection::with(['items.type'])->get();

关于php - 如何通过3个以上的表建立Laravel Eloquent 模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56606827/

10-15 18:40