Запрос Laravel с несколькими таблицами

Мне нужно получить все данные «Prestation» со статусом «Disponible» и получить «first_name» и «last_name» соответствующего пользователя Items.

У меня есть три таблицы, первая - «Prestations»:

  • _id
  • имя
  • цена
  • создано в
  • updated_at

Второй - «Предметы», где мне нужно только проверить статус:

  • _id
  • количество
  • status ‹**** ---- "Disponible"
  • prestation_id
  • user_id

Последняя таблица - «Пользователи», где мне нужны first_name и last_name:

  • _id
  • имя
  • фамилия

Модель Prestation.php:

public function item()
 {
     return $this->hasMany('App\Models\Item');
 }

Модель Item.php:

public function prestation()
{
    return $this->belongsTo('App\Models\Prestation');
}

Модель User.php

public function items()
{
    return $this->hasMany('App\Models\Item');
}

Я прочитал документацию Laravel и попробовал что-то вроде:

/**
//  * @param Request $request
//  * @return mixed
//  */
 public function prestationsListAvailables(Request $request, $conciergerie_select_id = null) 
 {
     $available = 'Disponible';

     $prestations = Prestation::with('item')
         ->whereHas('item', function($query) use ($available) {
             $query->whereIn('status', $available);
         })
         ->get();

     return $prestations;
 }

Но на этом этапе ничего не работает. Я тоже пробовал просто это, и это работает:

/**
 * @param Request $request
 * @return mixed
 */
public function prestationsListAvailables(Request $request, $conciergerie_select_id = null) 
{
    $prestations = Prestation::with([
    ])
    ->get();

    return $prestations;
}

Здесь я получаю все «Prestations», но мне нужно проверить, доступен ли статус, и получить first_name и last_name соответствующего пользователя. Спасибо за помощь.


person Tony S    schedule 26.12.2019    source источник


Ответы (2)


Вы можете это попробовать?

/**
//  * @param Request $request
//  * @return mixed
//  */
 public function prestationsListAvailables(Request $request, $conciergerie_select_id = null) 
 {
     $available = 'Disponible';

     $prestations = Prestation::whereHas('item', function($query) use ($available) {
             $query->where('status', $available);
         })
         ->join('items', 'items.prestation_id', '=', 'prestations.id')
         ->join('users', 'users.id', '=', 'items.user_id')
         ->get([
             'prestations.*',
             'users.firstname AS firstname',
             'users.lastname AS lastname'
         ]);

     return $prestations;
 }
person Michaël    schedule 26.12.2019
comment
Привет, спасибо за ваше предложение, обработка «статуса» выглядит нормально, но я получаю только идентификатор prestation, а не имя и фамилию. Я попытался изменить фамилию и имя на last_name и first_name, но результат тот же. - person Tony S; 26.12.2019
comment
Попробуйте использовать выбранный статус (laravel.com/docs/5.8/queries#selects ), чтобы определить возвращаемые значения и просто использовать - ›get (); - person Michaël; 26.12.2019
comment
Тот же результат с: $ prestations = Prestation :: whereHas ('item', function ($ query) use ($ available) {$ query- ›where ('status', $ available);}) -› join ('items' , 'items.prestation_id', '=', 'prestations.id') - ›join ('users', 'users.id', '=', 'items.user_id') -› select (['prestations. * ',' users.first_name AS firstname ',' users.last_name AS lastname ']) - ›get (); - person Tony S; 26.12.2019

Я бы создал отношение ownToMany между пользователем и элементом:

Презентация

public function users()
{
    return $this->belongsToMany('App\Models\User', 'items')->withPivot(['status','quantity']);
}

Затем вы можете запросить отношение с помощью:

Presentation::with(['users' => function ($query) use ($available) {
    $query->where('status', $available); // you are filtering the pivot table
}])->get();
person mdexp    schedule 26.12.2019