laravel关系中的多个条件

时间:2018-09-17 14:38:57

标签: laravel laravel-5

我有两个表,一个是User表,另一个是Booking表(基本上是票务预订应用程序)。

用户表:

userid    usertype
  01      normal
  02      agent
  03      normal
  ...      ...

在“预订”表中:

bookingid    userid    createdAt    updatedAt
   01         01       01-09-2018   17-09-2018
   02         03       31-08-2018   12-09-2018
  ...        ...          ...          ...

我需要做的是过滤今天(尤其是今天)用户和代理商完成的预订总数。因此,我在用户和预订表之间建立了如下关系:

public function users()
{
    return $this->belongsTo('App\User', 'userid');
}

和用户模型:

public function bookings()
{
    return $this->hasMany('App\Booking', 'userid');
}

现在,我需要通过过滤usertype作为正常人和代理商来获取今天的总预订量。例如-用户或代理商今天完成的预订总数(在预订表上)(通过检查预订表中的用户ID,我需要确定其代理商或普通用户),这样我就可以计算出普通用户预订的机票数量还有代理商。

我使用的控制器代码是:

$booking = Booking::all();
$users = User::all();
$ticketUserToday = Booking::with('users')->get()->where(['usertype','=','agent'],['createdAt','>=',Carbon::Today()]);

但是在dd时我得到null的值。

1 个答案:

答案 0 :(得分:1)

使用->get()后跟->where()与查询数据库不同;它将尝试过滤从Collection获得的Bookings中的Booking::get(),这就是为什么获得null的原因;由于->where()Builder类之间的Collection函数签名不同,因此无法正确过滤。

您要寻找的是->whereHas()角色上的Users->where()表上的Booking

$ticketsToday = Booking::with(["users"])
->where("createdAt", ">=", Carbon::today())
->whereHas("users" => function($subQuery){ 
   $subQuery->where("usertype", "=", "agent");
})->get();

此操作将在您的Booking表中查询正确的日期,然后将结果限制为具有一个或多个Usersusertype为“ agent”的任何结果。< / p>