具有动态表的雄辩模型..?

时间:2017-07-27 21:17:24

标签: laravel laravel-5

我有一个名为Item的通用模型和一个名为Itemproperties的相关模型。

项目 - > hasOne - > Itemproperties

Itemproperties - > belongsTo - >项目

Item模型有一个名为'itemtype_id'的属性,它告诉模型要存储哪个表。例如:itemtype = 1,那么tabletype = 2的表是itemproperties_1,然后table是itemproperties_2。

所以我改变了Itemproperties模型的getTable()方法:

function getTable(){
    return 'item_properties_' . $this->itemtype_id;
}

因此,在创建新项目及其属性时,我一直在设置像这样的Itemproperties:

// Create & Save the Item
$item = new Item(['itemtype_id' => $itemtype_id]);
$item->save();

// Save the Properties
$itemProperties = new ItemProperties($properties);
$itemProperties->itemtype_id = $item->itemtype_id;
$item->properties()->save($itemProperties);

在保存Itemproperties时,这似乎工作得很好。

但是,当我尝试检索它们时,通过执行$item->properties,我没有办法告诉它itemtype_id,因此无法找到正确的表。

我的问题: 有没有办法设置雄辩的关系,以便我可以将item-> itemtype_id传递给Itemproperties,以便知道要使用哪个表?

或者是否有更好的整体策略来完成我正在使用不同项目类型的不同表格做什么?

1 个答案:

答案 0 :(得分:0)

你不应该真的需要多个表来解决这个问题。在项目和属性之间建立关系就足够了。这意味着在Item模型中,您应该已经指定了与Property建立关系时要使用的列

public function property()
{
    return $this->hasOne(Property::class, 'itemtype_id', 'itemtype_id')
}

这意味着itemtype_id位于items表中,这里的假设是Property model中的itemtype_id是唯一的(一对一)

然后,当您必须保存新属性时:

$item = new Item(['itemtype_id' => $itemtype_id]);
$item->save();
//then saving properties
$item->property()->save($properties); //assuming you already have $properties.

构建查询时已经传递了itemtype_id并引用了它。这意味着如果您想要检索属性,只需要找到类型为id的项目:

$item = Item::where('itemtype_id', 1)->first();
//get the properties
$properties = $item->property;
//or simply get the properties by calling the Property model directly:
Property::where('item_property', 1)->first();

唯一的方式我可能错了,如果不同属性中的字段不同和/或我完全误解了这个问题,但通常你不需要多个表。