Laravel Querying Relations Model:: has ('relation') не работает


В документации 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();
Я действительно получаю совпадение, которое относится к фильму, поэтому я знаю, что отношение настроено правильно. Я не могу понять, что я делаю не так с фильмом:: есть метод, хотя.

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

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
1 5

1 ответ:

Это, однако, прекрасно работает с драйвером MySQL. При использовании SQLite в качестве драйвера базы данных, has возвращает пустую коллекцию, так как счетчик будет заключен в кавычки. Вы можете использовать метод DB::raw для передачи подсчета в виде необработанного выражения.

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

Смежные вопросы: #3353, #3435.

Edit: As patricus подтвердил, что эта проблема затрагивала только установки до Laravel 4.1.25. Вам не нужно использовать этот обходной путь с более новыми версии.