2013-08-18 56 views
1

我有了與我試圖建立在Laravel模型參數的多個子查詢的查詢。大廈查詢與查詢生成器或機鋒在Laravel 4

我是很新的Laravel 4,所以我真的很喜歡一些幫助,什麼是「最好」的方式來做到這一點。

,我需要複製的查詢是:

Select userId from facultyAvailability 
where 
    :startDate between startDate and endDate 
    and :endDate between startDate and endDate 
    and userId NOT IN(
    Select 
     userId 
    from 
     schedulerTrialSchedule 
     inner join `review` 
     on eventId=lectureId 
    where 
     trialId = :trialId 
     and (
     startDate between :startDate and :endDate 
     or endDate between :startDate and :endDate 
    ) 
) 
    AND userId IN (
    SELECT userId 
    from 
     faculty2FacultyCategory 
    where 
     categoryId in(:categoryIdList) 
) 

我真的不知道什麼方法鏈,共同打造這一點。任何幫助將不勝感激。

回答

2

好,一些試驗和錯誤之後,我覺得我來到了妥善解決。

我正在使用的雄辯的查詢範圍的功能。

public function scopeAvailable($query, $trialId, UnscheduledEvent $event) 
{ 
    $query->whereRaw('? BETWEEN startDate AND endDate', array($event->startDate)) 
     ->whereRaw('? BETWEEN startDate AND endDate', array($event->endDate)) 
     ->whereIn(
      'userId', function ($query) use ($trialId, $event) { 
       $query->select('userId') 
        ->from('schedulerTrialSchedule') 
        ->join('review', 'eventId', '=', 'lectureId') 
        ->where('trialId','=',$trialId) 
        ->where(
         function ($query) use ($event) { 
          $query->whereBetween('startDate', array($event->startDate, $event->endDate)) 
           ->orWhereBetween('endDate', array($event->startDate, $event->endDate)); 
         } 
        ); 
      } 
     ,'and',true); 
    return $query; 
} 

此範圍內產生一個查詢,看起來像:

select * 
from `facultyAvailability` 
where 
    ? BETWEEN startDate AND endDate 
    and ? BETWEEN startDate AND endDate 
    and `userId` not in (
    select `userId` 
    from `schedulerTrialSchedule` 
     inner join `review` on `eventId` = `lectureId` 
    where `trialId` = ? 
     and (`startDate` between ? and ? or `endDate` between ? and ?)) 

這正是我需要的是有問題的模型,我已經定義了一個範圍。如果有其他人需要知道如何解決這個問題,我在這裏發佈這個僅僅作爲參考。

我不得不說,我與雄辯/流利的應對做到這一點沒有我不得不求助於使用一堆原始SQL的能力相當深刻的印象。我不得不使用原始的SQL在所有的唯一原因是因爲whereBetween似乎並不能夠使用值的之間的列的第一個參數來處理一列,而不是作爲第二和第三arguements即'2013-08-09' BETWEEN column1 AND column2