2016-04-24 31 views
0

我有兩個表:事件和預訂 一個事件有許多預定最不受歡迎的事件 - 獲取事件的列表,其中預訂IS NULL或最

 
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; 

獲取所有事件和總預訂列表的一些預訂事件。

如何獲取根本沒有預訂的事件數據?

+1

有一個讀關於加入 – Strawberry

回答

0

好的。那麼,你需要獲得沒有預訂的活動?我們來看看這裏的一些解決方案。

我們可以使用雄辯這樣的東西。

比方說你有一個包含該方法的活動模式:它包含了方法

public function bookings() 
{ 
return $this->hasMany(Bookings::class, 'FK', 'PK'); 
} 

和預訂模型:

public function event() 
{ 
return $this->belongsTo(Event::class, 'FK', 'PK'); 
} 

您將能夠做這樣的事情在你的控制器:

$ events = Events :: whereHas('bookings') - > get() - > count();

這將獲取與他們綁定的所有事件的集合並對其進行計數。現在對於沒有預訂的事件來說,雄辯地解決了一個問題。

Laravels雄辯的ORM沒有我們可以使用的hasNot方法,但是我們可以使用Eagarloading約束來實現您所需要的結果。

我們能夠抓住它不要做這樣的事情有一個預訂的所有活動:

$events = Events::whereHas("bookings", function($q) { 
    $q->whereNotNull('deleted_at'); 
}, '<', 1)->get(); 

我認爲,應該給你這沒有預訂的所有事件的集合。

讓我知道你如何繼續!

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

+0

是的 - 這並不與上面相同的事情,可能更有效地不是你打電話雄辯的解決方案 - > whereNull('預訂.event_id「) – ExohJosh