【问题标题】:Laravel Query results being dropped after collection creation & paginate bug?Laravel 查询结果在集合创建和分页错误后被丢弃?
【发布时间】:2015-01-31 20:11:34
【问题描述】:

此查询有效并返回我想要的结果,但一旦变成集合或尝试“分页”,它将返回一个空结果。我尝试对一个简单的DB::table('users')->paginate(5)[0] 进行分页,它可以工作,所以我猜它不是来自分页本身。

代码

$photographers_available =  Photographer::where('is_photographer', '=', '1')
          ->where(function($q)use($city_id)
              {
            $q->whereHas('studioAddress', function($q)use($city_id)
         {
              $q->where('city_id', '=', $city_id);
         })
         ->orWhereHas('user', function($q)use($city_id)  // TK could reduce to 'user.address' I think
             { 
                $q->whereHas('address', function($q)use($city_id) 
              {
                 $q->where('city_id', '=', $city_id);
              });
             });
        })
          ->whereHas('stypesPhotographer', function($q)use($stype)
          {
        $q->where('shooting_type_id', '=', $stype);
          }) 
          ->whereHas('availabilities', function ($q) use ($selected_date_time)
              {
        $q->where('unavailable_start_date', '<', $selected_date_time)
          ->where('unavailable_end_date', '>', $selected_date_time);
        }, '=', 0)
          ->whereHas('bookings', function($q)use($selected_date_time)
              {
            $q->where('booking_date', '=', $selected_date_time);
        }, '=', 0)
          ->join('stypes_4_photographer', function($join)use($stype)
          {
            $join->on('photographer_id', '=', 'photographers.id')
               ->where('shooting_type_id', '=', $stype);
          });
 $photobla = $photographers_available->first();
 echo '<pre>';print_r($photobla);
 // RETURNS RESULTS CORRECTLY
 $photoTEST = $photographers_available->get();
 echo '<pre>';print_r($photoTEST);die();
 // RETURNS $photoTEST as NULL.....
 // WHY has $photographers_available BEEN EMPTIED?????

结果

// $photobla result
Photographer Object
(
    [fillable:protected] => Array
        (
            [0] => id
            [1] => is_photographer
            [2] => service_description
            [3] => radius_around_city_available
            [4] => tax_nbr
            [5] => user_id
            [6] => average_score
        )

    [table:protected] => photographers
    [touches:protected] => Array
        (
            [0] => stypesPhotographer
        )

    [connection:protected] => 
    [primaryKey:protected] => id
    [perPage:protected] => 15
    [incrementing] => 1
    [timestamps] => 1
    [attributes:protected] => Array
        (
            [id] => 677
            [is_photographer] => 1
[ETC>>>>>>>>]
         )
    [original:protected] => Array
        (
            [id] => 677
            [is_photographer] => 1
[ETC>>>>>>>>]
 )

    [relations:protected] => Array
        (
        )

    [hidden:protected] => Array
        (
        )

    [visible:protected] => Array
        (
        )

    [appends:protected] => Array
        (
        )

    [guarded:protected] => Array
        (
            [0] => *
        )

    [dates:protected] => Array
        (
        )

    [observables:protected] => Array
        (
        )

    [with:protected] => Array
        (
        )

    [morphClass:protected] => 
    [exists] => 1
)

// THE $photoTEST result:
Illuminate\Database\Eloquent\Collection Object
(
    [items:protected] => Array
        (
        )

)

所以你可以看到$photographers_available 在-&gt;first() 之后被清空了。最重要的是,即使在初始查询中直接使用,分页也无法正常工作。

【问题讨论】:

    标签: php database laravel collections eloquent


    【解决方案1】:
    $photographers_available; // it is a query, consider other name
    
    $photographers_available->first(); 
    // set limit 1 on the query and return it's result
    
    $photographers_available->get(); 
    // returns the query result (remember limit 1 above..)
    
    $photographers_available->paginate(); 
    // return the query result paginated (ignoring limit 1 above)
    

    我建议你这样做(没有这个first 电话):

    dd($photographers_available->get());
    

    或return 这个东西,而不是echo whataver,因为这不是办法。在控制器中输出类似的内容会破坏应用流程。


    回答您遇到的问题,例如在 cmets 中:将 laravel/framework 恢复到您之前的版本(在本地/开发服务器中)

    【讨论】:

    • 嗨@jarek,我不确定我是否在关注你。如果我这样做 dd($photographers_availeble->get());是的,它会起作用。我正在排序并输出第一个和 get 以测试并找到问题。但是 dd($photographers_available->paginate(5)[0]) 返回 Undefined offset: 0
    • 那里有很多连接,这可能会破坏Paginator 的功能,因为有时连接会出现问题。
    • 谢谢,这很奇怪,因为在我昨天运行作曲家更新之前它正在工作......我该怎么做才能解决它?
    • 在你的 composer.json 中使用 require: { laravel/framework: "4.2.YOUR_VER"... 恢复以前的 Laravel 版本
    • 问题是我部署了应用程序,所以服务器运行的是最新版本,不能让他回去......有办法解决吗? :0
    猜你喜欢
    • 2019-02-05
    • 2020-12-31
    • 2016-07-08
    • 2018-08-28
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多