2013-12-21 8 views
5

In der Laravel Dokumentation arbeiten sie sagt, dass Sie diese Syntax für die Abfrage ein Objekt Beziehung können nur die Beiträge zu erhalten, die mindestens einen Kommentar haben:Laravel Querying Relations Modell :: hat (‚Beziehung‘) nicht

$posts = Post::has('comments')->get(); 

Ich versuche etwas ähnliches, wo ich nur Objekte abrufen möchte, die mindestens ein Relation-Objekt haben. Das sind meine zwei Klassen:

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"); 
    } 
} 

Aber wenn ich rufe

$movies = Movie::has('matches')->get(); 

Ich erhalte eine leere Auflistung. Wenn ich rufe

$movie = Movie::find(1)->matches()->get(); 

Ich bekomme die Übereinstimmung, die sich auf den Film bezieht, so weiß ich, dass die Beziehung richtig eingerichtet ist. Ich kann nicht herausfinden, was ich falsch mache mit der Movie :: hat Methode.

Ich verwende die sqlite3-Datenbank, die in einem Laravel-Projekt enthalten ist, das mit Composer erstellt wurde. Dies ist die Struktur und die Daten:

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

Auch kann ich nicht sehen, wo die "hat" Methode herkommt. Die Model-Klasse hat keine "HAS" -Methode. – Mat

+0

Die Methode ist in der API-Dokumentation beschrieben: [hier] (http://laravel.com/api/master/Illuminate/Database/Eloquent/Builder.html#method_has) –

+0

Hast du herausgefunden, was das Problem war? Scheint das selbe Problem zu haben. – Markus

Antwort

6

Dies funktioniert jedoch gut mit dem MySQL-Treiber. Wenn Sie SQLite als Datenbanktreiber verwenden, gibt has eine leere Auflistung zurück, da die Anzahl in Anführungszeichen eingeschlossen wird. Sie können die Methode DB::raw verwenden, um die Zählung als unformatierten Ausdruck zu übergeben.

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

Verwandte Themen: #3353, #3435.

Edit: Als patricus diese Frage bejaht beeinflußte nur Installationen vor Laravel 4.1.25. Sie müssen diese Problemumgehung nicht mit neueren Versionen verwenden.

+1

Während dies zu der Zeit wahr war, wurde das Problem seit Version 4.1.25 behoben. Würde es Ihnen etwas ausmachen, Ihre Antwort zu aktualisieren, um diese Informationen hinzuzufügen? Keine Notwendigkeit, die Antwort zu ändern, da es für diese Frage richtig ist, aber eine Änderung hinzuzufügen, die Leuten mitteilt, dass sie das nicht mehr tun müssen, wäre gut. Ich wurde aufgefordert, dies zu prüfen, weil jemand gerade eine Frage mit dieser Syntax gepostet hat, die sie aus dieser Antwort kopiert haben. – patricus