2013-07-22 72 views
0

我在我的模型中有一個查詢函數,並且我試圖讓它獲取特定偏移量和返回行限制的輸入。這是查詢功能:Laravel 4動態查詢輸出錯誤

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方法OD,我們可以看到,爲什麼:

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

查詢中缺少LIMIT關鍵字和rowcount。該語法無效。

查詢應該是這樣的:

... DESC LIMIT 2 OFFSET 0 

OFFSET關鍵字是LIMIT條款的一部分,它不能只是單獨出現。這完全不清楚爲什麼Eloquent會生成它,因爲它不是有效的SQL。


跟進:

驗證$number_of_posts計算爲一個非負整數,從而可以產生有效LIMIT子句。如果$number_of_posts包含LIMIT有效值以外的內容,則不太可能會生成無效的SQL。

(它看起來像在查詢生成器的錯誤產生,包括OFFSET沒有相應的LIMIT聲明。

+0

Laravel的文檔顯示我應該使用skip()和take()作爲偏移和限制嗎?我應該如何在上面修改我的查詢? – user1072337

0

相反的:

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

用途:

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

您必須同時使用limit()和offset()

1000000 - 隨機數很大,因爲我們不想限制什麼