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 ответ:
Это, однако, прекрасно работает с драйвером MySQL. При использовании SQLite в качестве драйвера базы данных,
has
возвращает пустую коллекцию, так как счетчик будет заключен в кавычки. Вы можете использовать методDB::raw
для передачи подсчета в виде необработанного выражения.$posts = Post::has('comments', '>=', DB::raw(1))->get();
Смежные вопросы: #3353, #3435.
Edit: As patricus подтвердил, что эта проблема затрагивала только установки до Laravel 4.1.25. Вам не нужно использовать этот обходной путь с более новыми версии.