Laravel 4动态查询输出错误

时间:2013-07-22 22:31:21

标签: php mysql laravel laravel-4 eloquent

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

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

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

3 个答案:

答案 0 :(得分:0)

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

查询应该是:

... DESC LIMIT 2 OFFSET 0

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


<强>跟进:

验证$number_of_posts求值为非负整数,以便生成有效的LIMIT子句。如果$number_of_posts包含LIMIT的有效值之外的其他内容,则它不太可能生成无效的SQL。

(看起来查询构建器中的错误是生成包含OFFSET而没有相应LIMIT的语句。

答案 1 :(得分:0)

我刚刚尝试了您的代码,只要我为$start$number_of_posts提供非空的正值,它就可以在这里运行。当我不为$number_of_posts执行此操作时,我得到的查询完全相同,所以我猜你在将$number_of_posts传递给函数时可能会失败。

检查源代码时,在Illuminate\Database\Query\Builder的{​​{1}}方法中,我们可以看到原因:

take

仅当值大于0时才设置限制值。

答案 2 :(得分:0)

而不是:

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

使用:

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

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

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