【问题标题】:Laravel Eloquent, return rows where both conditions are TrueLaravel Eloquent,返回两个条件都为真的行
【发布时间】:2015-07-02 11:17:05
【问题描述】:

我有一个周表,它连接到一个属性表,周表如下所示:-

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 中没有行,因为只有一周可用。

我尝试了各种方法,但要么一无所获,要么总是返回第 1、第 2 和第 4 行。

我认为这很接近,但它仍然缺少一些东西,因为它正在寻找 =

的日期
 $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 有效。

从 tblweeks 中选择 PropID,其中 WeekDate IN ('2015-07-04', '2015-07-11') AND Available = 'yes' GROUP BY PropID HAVING COUNT(*) = 2

【问题讨论】:

  • 你能分享你的Property table的样本数据吗?想知道这是否有帮助!
  • 你能贴出你的型号代码吗?
  • 还假设 WeekDate 是一个日期,你能确认这是真的吗?

标签: php mysql laravel eloquent


【解决方案1】:

这只会将您的结果显示为 Property 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();

【讨论】:

  • 抱歉,示例表应该显示“是”而不是“Y”。
  • @PaulWright 我已经根据您的 sql 更新了我的答案。我已经在我的工作站中重新生成了数据和代码并对此进行了测试。它给出了属性 1 作为结果。
  • 天才。非常感谢 Ariful 和其他为此提供帮助的所有人。
【解决方案2】:

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

请检查此解决方案

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

这应该可以工作并且会返回期望的输出

【讨论】:

  • 不,抱歉,这给出了(WeekDate = '2015-07-04' 或 WeekDate = '2015-07-11' 和 Available = 'Yes')。
【解决方案3】:

有一些变化,查询可能使用分组查询:

请检查此解决方案

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

这应该可以工作并且会返回期望的输出

【讨论】:

    【解决方案4】:

    你实际上需要两个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();
    

    【讨论】:

    • 不,抱歉,没有给出正确的结果,在这些日期使用 Available=Yes 获取所有内容。
    • 只有在两个日期都可用时才返回行。感谢您对此的所有帮助。快把我逼疯了。我现在用 SQL 更新了这个问题,如果这有助于理解的话。
    • 嗯,这实际上是我的代码应该做的。你确定它不起作用?
    【解决方案5】:

    我相信你不需要第二个嵌套查询。

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

    【讨论】:

    • 这完全没有区别(虽然你说的没错,但是嵌套 where 没用)
    • 不,抱歉,这只是给出可用 = 是且日期为任一的行。
    猜你喜欢
    • 2022-01-02
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多