2013-12-21 101 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