目前在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/