Модель отношений запросов Laravel :: 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();

Я получаю совпадение, относящееся к фильму, поэтому я знаю, что отношение настроено правильно. Я не могу понять, что я делаю неправильно с методом Movie::has.

Я использую базу данных 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

person Mat    schedule 21.12.2013    source источник
comment
Кроме того, я не понимаю, откуда берется метод «есть». В классе Model нет метода has.   -  person Mat    schedule 27.12.2013
comment
Метод описан в документации API: здесь   -  person The Sauralph    schedule 21.01.2014
comment
Вы разобрались, в чем дело? Кажется, та же проблема.   -  person Markus    schedule 17.02.2014
comment
К сожалению нет. Это личный проект, поэтому у меня не было много времени на его отладку. Я начал использовать метод Illuminate/Database/Eloquent/Builder::has, как указал Sauralph, но в операторе return он вызывает $query->toSql(), и результирующий SQL кажется проблемой. Я постараюсь посмотреть на это снова сегодня вечером и опубликовать SQL, который он генерирует.   -  person Mat    schedule 18.02.2014
comment
Я переключился на MySQL, и проблема исчезла. Я проверил запросы, которые генерирует Laravel, и они отлично работают как в MySQL, так и в SQLite, поэтому я до сих пор не уверен, почему набор результатов пуст при использовании SQLite.   -  person Mat    schedule 22.02.2014


Ответы (1)


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

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

Связанные проблемы: #3353, #3435.

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

person cdog    schedule 19.03.2014
comment
Хотя в то время это было правдой, проблема была исправлена, начиная с версии 4.1.25. Не могли бы вы обновить свой ответ, чтобы добавить эту информацию? Нет необходимости менять ответ, так как он правильный для этого вопроса, но добавление редактирования, позволяющего людям знать, что им больше не нужно этого делать, было бы хорошо. Мне было предложено изучить это, потому что кто-то только что опубликовал вопрос с этим синтаксисом, который они скопировали из этого ответа. - person patricus; 18.02.2016