如何在Laravel中正确实现这种多态关系?

时间:2019-06-29 16:21:56

标签: laravel eloquent

我正在尝试为Laravel 5.8中的用户建立一个清单,但是这些项目具有自己的属性,因此我需要建立一个多态关系。将项目附加到用户时,它会尝试将模型用户添加到itemable_type上的表中,并将用户ID添加到itemable_id上,并将用户ID添加到user_id上,我可以通过以下方法解决通过我需要的模型,但是当我尝试检索它们时,它会尝试查找具有itemable_type ='App \ Models \ User'的商品,这让我觉得这里有些错误。我可以对解决方法有一些了解吗?

class User extends Model
{
    public function inventory()
    {
        return $this->morhpToMany(InventoryItem::class, 'itemable', 'user_inventories', null, 'itemable_id')
            ->withPivot('amount', 'notes');
    }
}
class InventoryItem extends Model
{
    public $timestamps = false;

    protected $table = 'character_inventories';

    protected $fillable = [
        'character_id', 'itemable_type', 'amount', 'parent_id', 'notes'
    ];

    public function cloth()
    {
        return $this->mophedByMany(Cloth::class, 'itemable');
    }

    public function food()
    {
        return $this->morphedByMany(Food::class, 'itemable');
    }

    // Other similar relations
}
// The Inventory migration:
 Schema::create('user_inventories', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->unsignedInteger('itemable_id');
    $table->string('itemable_type');
    $table->unsignedInteger('amount')->default(0);
    $table->text('notes', 65535)->nullable();

    $table->foreign('character_id')->references('id')->on('characters');
});

预期结果是用户模型中的库存中有不同的物料,但是该关系正试图通过联接到自身并通过用户类型(而不是实际物料)进行过滤来进行查询。

错误:

Syntax error or access violation: 1066 Not unique table/alias: 'user_inventories' (SQL: 
select `user_inventories`.*, 
    `user_inventories`.`itemable_id` as `pivot_itemable_id`, 
    `user_inventories`.`itemable_type` as `pivot_itemable_type`, 
    `user_inventories`.`amount` as `pivot_amount`, 
    `user_inventories`.`parent_id` as `pivot_parent_id`, 
    `user_inventories`.`notes` as `pivot_notes` 
from `user_inventories` 
inner join `user_inventories` on `user_inventories`.`id` = `user_inventories`.`itemable_id` 
where `user_inventories`.`itemable_id` in (4) 
and `user_inventories`.`itemable_type` = App\Models\User)

1 个答案:

答案 0 :(得分:0)

我非常怀疑您必须在inventory关系中引用用户表。通常,遵循Laravel命名约定要容易一百万倍。

public function inventory()
{
    return $this->morhpToMany(InventoryItem::class, 'itemable', 'users', null, 'itemable_id')
        ->withPivot('amount', 'notes');
}