Как определить отношения и получить все записи с отношениями в Laravel? - PullRequest
0 голосов
/ 28 января 2019

Я хочу определить связь между таблицами, и я не знаю, где я ошибаюсь.

Это мои таблицы:

пользователи

    -id
    -email
    -level

рестораны

    -id
    -name
    -user_id

меню

    -id
    -name

restaurant_menu

    -restaurant_id
    -menu_id
    -price

В таблице users поле level будет задано мной двумя словами: [user] или [restaurant].

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

public function restaurant(){
    return $this->hasOne(Restaurant::class);
}

Модель ресторана

public function menus(){
    return $this->hasMany(Menu::class);
}

Модель меню

public function restaurants(){
    return $this->belongsTo(Restaurant::class);
}

Я ожидаю вывод этого кода:

$result = $restaurant->where('id',2)->menus()->get(); 

Должны быть записи и отношения, но я получаю следующую ошибку.

BadMethodCallException Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: menus ()

Что мне делать?

Ответы [ 4 ]

0 голосов
/ 28 января 2019

IN модель пользователя

public function restaurant(){
   return $this->hasMany(Restaurant::class,'user_id','id');
}

Модель ресторана

public function menus(){
   return $this->hasMany(Menu::class,'id','menu_id');
}

Модель меню

public function restaurants(){
  return $this->belongsTo(Restaurant::class);
}

По мере того, как вы аспектируете свой вывод, вам нужно написать

$result = Restaurant::with('menus')->where('id',2)->get(); 

вы получите реляционные данные.Например, какие рестораны имеют какие меню.

Вы также можете использовать это для своего сценария.Используйте это в своей модели ресторана

public function menues(){
  return $this>hasManyThrough(Menu::class,restaurant_menu::class,'menu_id','id','id','restaurant_id');
} 
0 голосов
/ 28 января 2019

Отношения, которые вы определяете, недоступны для вас в области действия query вашего экземпляра компоновщика так, как вы пытались их вызвать.Они доступны в контексте ваших моделей .Включение ваших отношений в запросы выполняется по-другому - вам следует сначала проверить официальную документацию по этому вопросу .

В вашем случае, если вы хотите выбрать все меню, относящиеся к конкретному ресторану, который у вас естьна пути:

  1. Вы можете сначала выбрать определенный ресторан, а затем получить его меню через отношения:

    $restaurant = Restaurant::find(2);
    $menus = $restaurant->menus;
    
  2. Вы можете запросить менючерез Menu модель:

    $menus = Menu::whereHas('restaurants', function ($query) {
        $query->where('id', 2);
    })-get();
    

Также ваши отношения настроены неправильно.Исходя из структуры таблицы, которую вы указали, ваши меню и рестораны находятся в многих ко многим отношениях.Поэтому restaurants() метод отношения в Menu классе должен возвращать BelongsToMany экземпляр.Поэтому, пока вы занимаетесь этим, я настоятельно рекомендую вам изучить документацию по отношениям и посмотреть примеры, пока вы не поймете, как работают разные отношения в Laravel.

0 голосов
/ 28 января 2019

Есть проблема с вашими отношениями.У вас есть отношение один ко многим между моделью ресторана и моделью меню.Тем не менее, ваша структура таблицы предполагает, что они имеют модель «многие ко многим».

Если вы считаете, что ваша модель верна, измените таблицу меню следующим образом:

меню

-id
-name
-restaurant_id //new field

Также удалите таблицу "restaurant_menu".

Если вы считаете, что ваша база данных верна, попробуйте соответствующим образом изменить модель.

0 голосов
/ 28 января 2019

На самом деле,

Вы правильно определили отношения.Я думаю, что у вас есть проблема с получением этих отношений на красноречивых запросах.Если вы хотите получить отношение меню конкретного ресторана;вы должны реализовать что-то подобное.

$restaurant = Restaurants::find(2);
$restaurant->menus(); // this will return an array of related menus.

Вы должны прочитать Официальная документация Laravel .Для каждого определения отношения есть получение отношения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...