Eloquent:过滤数据透视表和模型表

时间:2017-05-02 23:05:05

标签: mysql laravel eloquent

雄辩的关系如下:

"存储"属于许多"存储时间" (属于很多人)

数据透视表(store_day_time_stores)有一个名为" user_id"的密钥,storedaytimes表有一个名为" date"的字段。

我想过滤"存储时间"基于给定的" user_id(来自数据透视表)"和"开始"和"结束" date(来自storedaytime表)。

我当前的查询是

$storedaytime->stores()
    ->wherePivot('user_id','=',$user)
    ->orderBy('date')
    ->where('date','>=',$start)
    ->where('date','<=',$end)->get();

它产生了一个非常可怕的查询,但它无效:

  

SQLSTATE [42S22]:未找到列:1054未知列&#39;日期&#39;在   &#39; where where&#39; (SQL:选择stores。*,   order_day_time_storeorder_day_time_id为   pivot_order_day_time_idorder_day_time_storestore_id为   pivot_store_idorder_day_time_storeuser_idpivot_user_id,   来自order_day_time_store内部联接的idpivot_idstores   order_day_time_store上的storesid =   order_day_time_storestore_id其中   order_day_time_storeorder_day_time_id为空   order_day_time_storeuser_id = 4和date&gt; = 2017-05-01 12:00:00   和date&lt; = 2017-05-31 12:00:00按date asc)订购

请帮助。谢谢你:3

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

$storedaytime->stores()
    ->wherePivot('user_id','=',$user)
    ->whereBetween('storedaytimes.date', [$start, $end])
    ->orderBy('storedaytimes.date')
    ->get();

除非您必须事先订购日期,否则建议order by子句位于SQL语句的末尾。在你的情况下没有理由这样做,所以把它放在最后。

答案 1 :(得分:0)

弄清楚自己:以下查询有效:

$storedaytime ->where('date','>=',$start)
->where('date','<=',$end)
->whereHas('stores',function($q) use($user){
                $q->where('user_id',$user);})
->get();