最不受欢迎的活动 - 获取预订为空或最低

时间:2016-04-24 11:44:23

标签: mysql database laravel laravel-5

我有两个表:事件和预订 一个活动有很多预订

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;

获取包含某些预订的活动的所有活动和总预订的列表。

如何获取完全没有预订的活动数据?

2 个答案:

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