簡體   English   中英

Laravel Eloquent,返回兩個條件都為真的行

[英]Laravel Eloquent, return rows where both conditions are True

我有一個連接到屬性表的周表,周表看起來像這樣:-

PropID, WeekDate,    Available

1     , 2015-07-04,      Yes

1     , 2015-07-11,      Yes

1     , 2015-07-18,      No

2     , 2015-07-04,      Yes

2     , 2015-07-11,      No

2     , 2015-07-18,      No

我想選擇第 4 周和第 11 周都可用的屬性。 在上面的示例中,我想返回帶有 PropID 1 的兩行,因為它們都可用,而沒有來自 PropID 2 的行,因為只有一周可用。

我嘗試了各種方法,但要么一無所獲,要么總是返回第一行、第二行和第四行。

我認為這很接近,但它仍然缺少一些東西,因為它正在尋找 <= AND >= 的日期

 $query = Property::whereHas('Week', function($q) use ($arrive)
            {
                $q->where(function($sub)
                {
                    $sub->where('WeekDate', '>=', '2015-07-04');
                    $sub->where('WeekDate', '<=', '2015-07-11');

                });
                $q->where('Available', '=', 'Yes');
            })
                ->get();

不確定這有幫助,但屬性表只是

PropID, PropName

    1     , Property 1

    2     , Property 2

剛剛發現這個 SQL 有效。

SELECT PropID FROM tblweeks WHERE WeekDate IN ('2015-07-04', '2015-07-11') AND Available = 'yes' GROUP BY PropID HAVING COUNT(*) = 2

這將使您的結果僅作為屬性 1

$weeks = Property::whereHas('Week', function ($q) {
    $q->where(function ($sub) {
        $sub->whereIn('WeekDate', array('2015-07-04', '2015-07-11'));
        $sub->where('Available', '=', 'y');
    });
    $q->groupBy('property_id');
    $q->having('count(*)', '=', '2');
})->get();

我相信您不需要第二個嵌套查詢。

 
 
 
 
  
  
  $query = Property::whereHas('Week', function($q) use ($arrive) { $q->where('WeekDate', '>=', '2015-07-04'); $q->where('WeekDate', '<=', '2015-07-11'); $q->where('Available', '=', 'Yes'); }) ->get();
 
 
 

更新

你有沒有研究過whereBetween

$query = Property::whereHas('Week', function($q) use ($arrive)
{
  $q->whereBetween('WeekDate', '2015-07-04', '2015-07-11');
  $q->where('Available', '=', 'Yes');
})
->get();

我在您的查詢中做了一些更改:

請檢查此解決方案

$query = Property::whereHas('Week', function($q) use ($arrive)
{
  $q->where('WeekDate', '=', '2015-07-04');
  $q->orWhere('WeekDate', '=', '2015-07-11');
  $q->where('Available', '=', 'Yes');
})
->get();

這應該有效,並將返回期望輸出

有一些變化,查詢可能使用 group by query :

請檢查此解決方案

$query = Property::whereHas('Week', function($q) use ($arrive)
{
  $q->where('WeekDate', '=', '2015-07-04');
  $q->orWhere('WeekDate', '=', '2015-07-11');
  $q->where('Available', '=', 'Yes');
  $q->group('WeekDate');
})
->get();

這應該有效,並將返回期望輸出

whereHas ,您實際上需要兩個whereHas

 $query = Property::whereHas('Week', function($q) use ($arrive)
                  {
                      $q->where('WeekDate', '>=', '2015-07-04');
                      $q->where('Available', '=', 'Yes');
                  })
                  ->whereHas('Week', function($q) use ($arrive)
                  {
                      $q->where('WeekDate', '<=', '2015-07-11');
                      $q->where('Available', '=', 'Yes');
                  })
                  ->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM