【问题标题】:Laravel 4 Dynamic Query Being Output WrongLaravel 4 动态查询输出错误
【发布时间】:2013-07-21 20:05:00
【问题描述】:

我的模型中有一个查询函数,我试图让它输入特定偏移量和返回行的限制。这是查询函数:

public static function friend_activity_json($start = 0, $number_of_posts = 2) {
        $friend_activity = DB::table('fanartists')
                        ->join('fans', 'fanartists.fan_id', '=', 'fans.id')
                        ->join('artists', 'fanartists.artist_id', '=', 'artists.id')
                        ->orderBy('fanartists.created_at', 'DESC')
                        ->skip($start)
                        ->take($number_of_posts)
                        ->select('fans.fbid', 'fans.first_name', 'fans.last_name', 'fans.gender', 'fans.city', 'fanartists.artist_id', 'artists.stage_name', 'fanartists.created_at')
                        ->get();

        $posts = $json_encode($friend_activity);

        return $posts;

    }

当我调用这个查询函数时,我得到了错误:

    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL
 syntax; check the manual that corresponds to your MySQL server version for the right syntax
 to use near 'offset 0' at line 1 (SQL: select `fans`.`fbid`, `fans`.`first_name`, 
`fans`.`last_name`, `fans`.`gender`, `fans`.`city`, `fanartists`.`artist_id`, 
`artists`.`stage_name`, `fanartists`.`created_at` from `fanartists` inner join `fans` on 
`fanartists`.`fan_id` = `fans`.`id` inner join `artists` on `fanartists`.`artist_id` = 
`artists`.`id` order by `fanartists`.`created_at` DESC offset 0) (Bindings: array ( )) 

你知道问题是什么吗?谢谢您的帮助。

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    查询中缺少 LIMIT 关键字和行数。该语法无效。

    查询应该是这样的:

    ... DESC LIMIT 2 OFFSET 0
    

    OFFSET 关键字是LIMIT 子句的一部分,它不能单独出现。完全不清楚 Eloquent 为什么会生成它,因为它不是有效的 SQL。


    跟进:

    验证$number_of_posts 的计算结果为非负整数,以便可以生成有效的 LIMIT 子句。如果$number_of_posts 包含的不是有效的 LIMIT 值,则它不太可能生成无效的 SQL。

    (看起来查询生成器中的错误正在生成一个包含OFFSET 而没有相应LIMIT 的语句。

    【讨论】:

    • Laravel 的文档显示我应该使用 skip() 和 take() 进行偏移和限制?我应该如何修改上面的查询?
    【解决方案2】:

    我刚刚尝试了您的代码,它确实可以在这里工作,前提是我为$start$number_of_posts 提供了一个非空的正值。当我不为$number_of_posts 执行此操作时,我得到的查询与您得到的查询完全相同,所以我猜您在将$number_of_posts 传递给函数时可能在某个地方失败了。

    查看源代码时,在Illuminate\Database\Query\Buildertake方法上,我们可以看出原因:

    /**
     * Set the "limit" value of the query.
     *
     * @param  int  $value
     * @return \Illuminate\Database\Query\Builder|static
     */
    public function take($value)
    {
        if ($value > 0) $this->limit = $value;
    
        return $this;
    }
    

    如果值大于0,它只设置限制值。

    【讨论】:

      【解决方案3】:

      代替:

      $users = User::offset(5)->get();
      

      用途:

      $users = User::limit(10000000)->offset(5)->get();
      

      必须同时使用limit()和offset()

      1000000 - 随机大数,因为我们不想限制任何东西

      【讨论】:

        猜你喜欢
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多