Laravel查询多个表

时间:2019-12-26 09:03:55

标签: laravel request query-builder laravel-query-builder

我需要获取状态为“ Disponible”的所有“ Prestation”数据,并获取相关项目用户的“ first_name”和“ last_name”。

我有三个表,第一个是“ Prestations”:

  • _id
  • 名称
  • 价格
  • created_at
  • updated_at

第二个是“项目”,我只需要测试状态:

  • _id
  • 数量
  • 状态 <<<< ----“不负责任”
  • prestation_id
  • user_id

最后一个表是“用户”,我需要名字和姓氏:

  • _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”,但我需要测试状态是否不可靠,并获取有关用户的名字和姓氏。 谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

你可以试试吗?

/**
//  * @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;
 }

答案 1 :(得分:0)

我将在User和Item之间创建一个EmiratesToMany关系:

介绍

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();