NimuraF
@NimuraF

Отношение M:M в Laravel на основе строковых полей?

Недавно решил посвятить свободное время на более углублённое изучение довольно популярной лары, однако возник небольшой казус, который поставил меня в тупик. В чём суть: существуют две таблицы, допустим, games и game_genres (именно так, т.к. в системе есть жанры и для других категорий), сводная для них будет games_games_genres, при этом я хочу сделать сводную не по id, а по полям name, так и так в обоих таблицах они определены как уникальные, пытаюсь загнать подобную тему стандартными методами лары.
//Для игр
    public function genres() {
        return $this->belongsToMany(game_genres::class, 'games_games_genres', 'game_name', 'genre_name');
    }

    //Для жанров
    public function games() {
        return $this->belongsToMany(games::class, 'games_games_genres', 'genre_name', 'game_name')->withPivot('genre_name')->withTimestamps();
    }

//Сам запрос
$data = games::with('genres')->paginate(10);

И вот в чём загвоздка, в дате для каждого объекта создаётся массив genre: [], но при этом он пустой, хотя записи об этих самых жанрах есть. Раньше мне доводилось подобное проворачивать через pivot, но в этом конкретном случае я уже по всякому покрутился, но всегда null, соответственно, вопрос, в чём может быть причина?

Миграция сводной.
Schema::create('games_games_genres', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            //Внешний ключ на игры
            $table->string('game_name');
            $table->foreign('game_name')->references('name')->on('games')->onDelete('cascade');

            //Внешний ключ на жанры
            $table->string('genre_name');
            $table->foreign('genre_name')->references('name')->on('game_genres')->onDelete('cascade');

            //Создание уникальной пары
            $table->unique(['game_name','genre_name'], 'game_name_genre_name_unique');
        });

Неужто по умолчанию лара поддерживает только по id? Сделать второй запрос ручками не то что бы сложно, но хотелось бы понять, мб это я что-то неправильно понимаю?
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
public function genres() {
        return $this->belongsToMany(game_genres::class, 'games_games_genres', 'game_name', 'genre_name', 'name', 'name')->withTimestamps();
    }

    //Для жанров
    public function games() {
        return $this->belongsToMany(games::class, 'games_games_genres', 'genre_name', 'game_name', 'name', 'name')->withTimestamps();
    }


Когда у вас нестандартные поля для связей - указывать надо все. Он вместо необходимого name подставляет по привычке id
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы