2013-12-21 91 views
5

在Laravel文檔,它說,你可以使用這個語法查詢對象的關係纔拿到的是有帖子至少一個註釋:Laravel查詢關係模式::擁有(「關係」)不工作

$posts = Post::has('comments')->get(); 

我想要類似的地方,我只想獲取至少有一個關係對象的對象。這些是我的兩個類:

class Movie extends Eloquent { 
    protected $table = 'movie'; 

    public function matches() { 
     return $this->hasMany("Match"); 
    } 
} 

class Match extends Eloquent { 
    protected $table = 'match'; 

    public function movie() { 
     return $this->belongsTo("Movie"); 
    } 
} 

但是,當我打電話

$movies = Movie::has('matches')->get(); 

我得到一個空的集合。如果我叫

$movie = Movie::find(1)->matches()->get(); 

我做得到,涉及到電影中的比賽,所以我知道的關係是正確安裝。雖然我無法弄清楚我在做什麼錯了Movie :: has方法。

我正在使用由composer創建的laravel項目中包含的sqlite3數據庫。這是結構和數據:

sqlite> .schema movie 
CREATE TABLE "movie" ("id" integer not null primary key autoincrement, "title" varchar not null); 

sqlite> .schema match 
CREATE TABLE "match" ("id" integer not null primary key autoincrement, "movie_id" integer not null, "title" varchar not null, foreign key("movie_id") references "movie"("id")); 
CREATE INDEX match_movie_id_index on "match" ("movie_id"); 

sqlite> select * from movie; 
1|Test Movie 

sqlite> select * from match; 
1|1|Test Movie Match 
+0

另外,我看不到'has'方法來自哪裏。 Model類沒有'has'方法。 – Mat

+0

該方法在API文檔中描述:[here](http://laravel.com/api/master/Illuminate/Database/Eloquent/Builder.html#method_has) –

+0

您是否知道問題所在?似乎有同樣的問題。 – Markus

回答

6

然而,這對MySQL驅動程序正常工作。當使用SQLite作爲數據庫驅動程序時,has返回一個空集合,因爲計數會被換成引號。您可以使用DB::raw方法將計數作爲原始表達式傳遞。

$posts = Post::has('comments', '>=', DB::raw(1))->get(); 

相關的問題:#3353#3435

編輯:由於patricus肯定此問題僅影響Laravel 4.1.25之前的安裝。您不需要對較新版本使用此解決方法。

+1

雖然這是真的,但是從4.1.25版本開始,問題就已經解決了。您介意更新您的答案以添加此信息嗎?不需要改變答案,因爲這個問題是正確的,但添加一個讓人們知道他們不再需要這樣做的編輯會很好。我被提示研究這個問題,因爲有人剛剛從這個答案中複製了這個語法的問題。 – patricus