我有两个表,一个是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
的值。
答案 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
表中查询正确的日期,然后将结果限制为具有一个或多个Users
和usertype
为“ agent”的任何结果。< / p>