Связь laravel со многими ко многим

Я застрял в том, как легко связать моих пользователей с другими таблицами. Я безуспешно пытался работать с обработкой полиморфных таблиц laravel. Вот как выглядят мои таблицы (игнорируйте множественное использование экипировки и брони, позже изменится).

У пользователя будет много оборудования, которое указывает на одно оружие или броню.

:: users ::
id
name

:: equipment ::
id
user_id
equipment_id
equipment_type

:: weapons ::
id
name

:: armors ::
id
name

Я бы хотел получить оружие и доспехи пользователей.

$user->weapons ( Should return all weapons )
$user->armors ( Should return all armors )

Внутри моей БД у меня есть 2 записи в таблице оборудования:

id: 1
user_id: 21 (current user)
equipment_id = 1 (id of a weapon in weapons table)
equipment_type = weapon (string)

id: 2
user_id: 21 (current user)
equipment_id = 2 (id of a weapon in weapons table)
equipment_type = weapon (string)

Это моя текущая попытка использовать полиморфные таблицы larvel

UserModel:

class User extends Authenticatable
{
  public function weapons()
  {
    return $this->morphedByMany('App\Weapon', 'equipment');
  }
}

ОружиеМодель:

class Weapon extends Model
{  
    public function users()
    {
     return $this->morphToMany('App\User', 'equipment');
    }
}

вы должны определить отношения, чтобы сделать это

Shailendra Gupta 31.10.2018 14:02

@ShaielndraGupta Что вы имеете в виду под определением отношений? Не могли бы вы привести пример, спасибо.

Dille Fepp 31.10.2018 14:09

вы установили связь с оборудованием с пользователем по user_id аналогичным образом, вы должны установить связь между оборудованием и моделями брони и оружия

Shailendra Gupta 31.10.2018 14:12

@ShaielndraGupta Хорошо, я понимаю, это имеет смысл. Как вы думаете, мне следует использовать morphToMany внутри оборудования для брони и оружия, или как вы думаете, я должен справиться с этим, чтобы также получить право через equipmentable_type

Dille Fepp 31.10.2018 14:16

Используйте laravel.com/docs/….

Jonas Staudenmeir 31.10.2018 14:18

@JonasStaudenmeir Я пробовал следовать документации и получаю пустую коллекцию. Я уточню вопрос, что я пытался сделать. Пожалуйста, проверьте, есть ли у вас время

Dille Fepp 31.10.2018 14:37

@ShaielndraGupta Я обновил ответ по-новому, а также то, что находится в моей таблице оборудования. Не могли бы вы проверить, видите ли вы что-нибудь не так.

Dille Fepp 31.10.2018 14:50

Вы используете кастомный Relation::morphMap()? В противном случае equipment_type должен содержать имена классов: App\Weapon, App\Armor.

Jonas Staudenmeir 31.10.2018 14:53

@JonasStaudenmeir БОЛЬШОЕ спасибо, вот и все, я думал, что устанавливаю имена, но я не ... Я создал Relation :: morphMap () и определил их, и это сработало. Установите это как ответ, если хотите получить кредит. Спасибо

Dille Fepp 31.10.2018 15:06
1
9
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Столбец equipment_type должен содержать полное имя класса, например App\Weapon.

В качестве альтернативы вы можете определить собственный $morphMap в AppServiceProvider::boot():

Relation::morphMap([
    'armor' => 'App\Armor',
    'weapon' => 'App\Weapon',
]);

Другие вопросы по теме