Laravel связь с типами - PullRequest
       1

Laravel связь с типами

0 голосов
/ 31 октября 2018

Я пытался найти лучшее решение для моей проблемы, не получая именно то, что я хочу.

У меня сейчас 4 таблицы, структура выглядит следующим образом.

:: Users ::
id
name
email
------

:: user_equipment ::
id
user_id
equipment_id
equipment_type

:: weapons ::
id
name
price

:: armor ::
id
name
price

Моя цель - использовать мои отношения следующим образом:

$user->equipment
$user->equipment->weapons
$user->equipment->armor

Вот что у меня сейчас есть:

Модель пользователя:

class User extends Model
{    
  public function equipment()
  {
    return $this->hasOne(UserEquipment::class);
  }
}

Модель пользовательского оборудования:

class UserEquipment extends Model
{
   public function weapons()
   {
     return $this->hasMany(Weapon::class);
   }
}

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Для меня это выглядит как полиморфное отношение «многие ко многим» .

В вашем случае вам нужно определить ваши отношения следующим образом:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get all of the weapons owned by the user.
     */
    public function weapons()
    {
        return $this->morphedByMany('App\Weapon', 'equipment', 'user_equipment');
    }

    /**
     * Get all of the armors owned by the user.
     */
    public function armors()
    {
        return $this->morphedByMany('App\Armor', 'equipment', 'user_equipment');
    }
}

Выполнение ваших запросов:

$user = App\User::find(1);

foreach ($user->weapons as $weapon) {
    //
}

foreach ($user->armors as $armor) {
    //
}
0 голосов
/ 31 октября 2018

Попробуйте изменить таблицы следующим образом:

:: Users ::
id
name
email
------

:: user_equipment ::
id
user_id
equipment_type

:: weapons ::
id
name
price
user_equipment_id

:: armor ::
id
name
price
user_equipment_id

Тогда вы можете использовать функции так, как вы их использовали: Модель пользователя:

class User extends Model
{    
  public function equipment()
  {
    return $this->hasOne(UserEquipment::class);
  }
}

Модель пользовательского оборудования:

class UserEquipment extends Model
{
   public function weapons()
   {
     return $this->hasMany(Weapon::class);
   }
   public function armor()
   {
     return $this->hasMany(Armor::class);
   }
}

Обратите внимание на документацию laravel, которую Laravel предполагает в модели Weapons, будет вызов внешнего ключа user_equipment_id: https://laravel.com/docs/5.7/eloquent-relationships#one-to-many

0 голосов
/ 31 октября 2018

Прежде всего, ваша модель User и модель UserEquipment имеют одно и то же имя класса.

Попробуйте, измените модель user на

public function weapons()
{
    return $this->hasMany('App\Weapon', 'equipment_id')->where('equipment_type','weapon'); //second paramater tells what column to relate the id
} 

public function armors()
{
    return $this->hasMany('App\Armors', 'equipment_id')->where('equipment_type','armor'); 
}

Тогда вот как вы делаете запрос:

User::with('weapons', 'armors')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...