Как правильно реализовать эти полиморфные отношения в Laravel? - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь создать инвентаризацию для пользователей в Laravel 5.8, однако у предметов есть свои свойства, поэтому мне нужно было установить полиморфные отношения.При присоединении элементов к пользователям он пытается добавить модель пользователя в таблицу на itemable_type и идентификатор пользователя на itemable_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 голосов
/ 30 июня 2019

Я очень подозреваю, что вы должны ссылаться на таблицу пользователей в отношении inventory.В целом, в миллион раз проще следовать правилам именования Laravel.

public function inventory()
{
    return $this->morhpToMany(InventoryItem::class, 'itemable', 'users', null, 'itemable_id')
        ->withPivot('amount', 'notes');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...