我有两个表:事件和预订 一个活动有很多预订
Event Bookings 1 1 1 2 1 3 2 //consider this as no row in bookings table 3 4 3 5 3 6 4
我需要获取没有预订的事件列表,即预订表中没有events_id的外键引用。 所以这里是活动2和4。 如果所有活动都有预订,那么预订最少的活动就会出现。
$query = select E.id, E.name,
count('B.event_id')
as totalbookings
from events E, bookings B where E.id = B.event_id
group by B.event_id;
获取包含某些预订的活动的所有活动和总预订的列表。
如何获取完全没有预订的活动数据?
答案 0 :(得分:0)
好。那么,您需要获得没有预订的活动吗?我们来看看这里的一些解决方案。
我们可以将Eloquent用于这样的事情。
假设您有一个包含方法的事件模型:
public function bookings()
{
return $this->hasMany(Bookings::class, 'FK', 'PK');
}
和包含方法的预订模型:
public function event()
{
return $this->belongsTo(Event::class, 'FK', 'PK');
}
您可以在控制器中执行以下操作:
$ events =活动:: whereHas('预订') - > get() - > count();
这将获取所有预订的事件的集合并计算它们。这很好地解决了一个问题,现在是针对没有预订的事件。
Laravels Eloquent ORM没有我们可以使用的hasNot方法,但是我们可以使用Eagarloading约束来实现您需要的结果。
我们可以通过执行以下操作来抓住所有没有预订的活动:
$events = Events::whereHas("bookings", function($q) {
$q->whereNotNull('deleted_at');
}, '<', 1)->get();
我相信这应该会为您收集所有没有预订的活动。
让我知道你是怎么过的!
答案 1 :(得分:0)
这也有效,我使用Left Join从事件表中获取所有事件,其中预订表中的事件没有匹配的id。 这是查询:
$least = Event::leftJoin('bookings', function($join)
{
$join->on('bookings.event_id', '=', 'events.id');
})
->select('events.name')
->whereNull('bookings.event_id')
->first();