1

Laravel モデルで構築しようとしているパラメータを持つ複数のサブクエリを持つクエリがあります。

私は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)
  )

これを構築するためにどの方法を連鎖させるべきか本当にわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

2

まあ、試行錯誤の末、適切な解決策にたどり着いたと思います。

Eloquent の Query Scope 機能を利用しています。問題のモデルでは、スコープを次のように定義しました。

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 ?))

これはまさに私が必要としていたものです。他の誰かがこの問題を解決する方法を知る必要がある場合に備えて、参考のためにここに投稿しています。

Eloquent/Fluent が、生の SQL を大量に使用しなくても、これに対処できることに非常に感銘を受けていると言わざるを得ません。生のSQLをまったく使用しなければならなかった唯一の理由はwhereBetween、2番目と3番目の引数として列を持つ間の最初の引数に列の代わりに値を使用して処理できないように見えるためです.'2013-08-09' BETWEEN column1 AND column2

于 2013-08-18T17:43:47.590 に答える