Php Laravel雄辩,返回两个条件都为真的行

Php Laravel雄辩,返回两个条件都为真的行,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有一个连接到属性表的周表,周表如下所示:- 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, 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中没有行,因为只有一周可用

我尝试过各种方法,但要么什么也得不到,要么总是返回第一、第二和第四行

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

刚刚发现这个SQL是有效的

从tblweeks中选择PropID,其中,
工作日('2015-07-04','2015-07-11')中的
可用的
='yes'组由具有COUNT(*)=2的PropID组成。我相信您不需要第二个嵌套查询

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

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

请检查此解决方案

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

这应该可以工作,并将返回愿望输出

这将仅将结果作为属性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->orWhere('WeekDate', '=', '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');
  $q->group('WeekDate');
})
->get();

这应该可以工作,并将返回期望输出

您实际上需要两个
,其中有

 $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();
$query=Property::whereHas('Week',function($q)use($arrival)
{
$q->where('WeekDate','>=','2015-07-04');
$q->where('Available','=','Yes');
})
->何处有('Week',函数($q)使用($Arrival)
{

$q->where('WeekDate',这一点都没有区别(尽管您是正确的,嵌套的where是无用的)不,对不起,这只是给出了行where Available=Yes,日期是其中之一。您可以共享属性表的示例数据吗?想知道这是否会有帮助!您可以发布模型代码吗?同时假设WeekDate是一个日期,您能确认这是真的吗?对不起,示例表应该显示“Yes”而不是“Y”@PaulWright我已根据您的sql更新了我的答案。我已在工作站中重新生成数据和代码,并对此进行了测试。结果为属性1。Genius。非常感谢Ariful和在此方面提供帮助的所有其他人。不,很抱歉(
WeekDate
='2015-07-04'或
WeekDate
='2015-07-11'和
可用
='Yes'))。不,很抱歉,这没有给出正确的结果,对于这些日期,Get everything with Available=Yes。仅在两个日期都可用时返回行。感谢您在这方面的所有帮助。让我发疯了。我现在用SQL更新了问题,如果这有助于理解的话,它可以工作。这实际上是我的代码应该做的。Ar你确定它不起作用吗?
 $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();