2013-12-21 7 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 ::.

Я использую базу данных sqlite3, включенную в проект laravel, созданный с помощью композитора. Ниже представлена ​​структура и данные:

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: [здесь] (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