2013-07-22 5 views
0

У меня есть функция запроса в моей модели, и я пытаюсь заставить ее принимать данные для конкретных смещений и ограничения возвращенных строк. Это функция запроса:Laravel 4 Dynamic Query Being Output Wrong

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

вы видите, что проблема? Спасибо за помощь.

ответ

0

Я просто попробовал ваш код, и он работает здесь, при условии, что я поставляю не нулевой, положительное значение $start и $number_of_posts. когда я не делаю этого для $number_of_posts, я получаю точно такой же запрос, который вы получаете, поэтому я думаю, вы, вероятно, где-то неудачу, при прохождении $number_of_posts функции.

когда проверка исходного кода на Illuminate\Database\Query\Buildertake meth О.Д., мы можем понять, почему:

/** 
* 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.

0

В запросе отсутствует ключевое слово и rowcount LIMIT. Этот синтаксис недействителен.

Запрос должен быть что-то вроде:

... DESC LIMIT 2 OFFSET 0 

OFFSET ключевого слова является частью пункта LIMIT, она не может появиться только сам по себе. Это не совсем понятно, почему Eloquent генерирует это, поскольку он недействителен SQL.


Followup:

$number_of_posts Убедитесь, что имеет значение неотрицательного целого числа, так что действительное положение ПРЕДЕЛ может быть сгенерирован. Если $number_of_posts содержит что-то отличное от допустимого значения для LIMIT, маловероятно, что он вызвал бы недопустимый SQL.

(Похоже, что ошибка в построителе запросов генерирует заявление, которое включает в себя OFFSET без соответствующего LIMIT.

+0

Документация для Laravel показывает, что я должен использовать skip() и принимать() для смещения и ограничения? Как мне поменять мой запрос выше? – user1072337

0

Вместо:

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

Использование:

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

Вы должны использовать ограничения() и смещения() в то же время

1000000 - случайное большое количество, потому что мы не хотим ничего ограничивать