Laravel eloquent und beziehungsreich
-
20-12-2019 - |
Frage
Ich habe einen Code:
$response = $this->posts
->where('author_id', '=', 1)
->with(array('postComments' => function($query) {
$query->where('comment_type', '=', 1);
}))
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();
Und als ich diese Abfrage protokollierte mit:
$queries = \DB::getQueryLog();
$last_query = end($queries);
\Log::info($last_query);
In der Protokolldatei sehe ich Folgendes:
"select * from `post_comments` where `post_comments`.`post_id` in (?, ?, ?, ?) and `comment_type` <> ?"
Warum steht in der Abfrage das Fragezeichen für comment_type?
Update Nr. 1:
Ich habe den aktuellen Code durch den folgenden ersetzt und bekomme, was ich will.Aber ich bin nicht sicher, ob es in Ordnung ist.Vielleicht gibt es viele bessere, schönere Lösungen.
$response = $this->posts
->where('author_id', '=', 1)
->join('post_comments', 'post_comments.post_id', '=', 'posts.id')
->where('comment_type', '=', 1)
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();
Lösung
Hinter den Kulissen gU wird verwendet und es ist so PDO
Dies geschieht als vorbereitete Abfrage. Überprüfen Sie beispielsweise Folgendes:
$title = 'Laravel%';
$author = 'John%';
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));
Zur Laufzeit während der Ausführung der Abfrage durch execute()
Die ?
Markierungen werden durch den übergebenen Wert ersetzt execute(array(...))
. Laravel/Eloquent
Verwendet PDO
und es ist normales Verhalten PDO
(PHP-Datenobjekte).Es gibt einen anderen Weg, der in verwendet wird PDO
, das heißt parameter/placeholder
wie :totle
wird anstelle von verwendet ?
.Lesen Sie mehr darüber im angegebenen Link, es ist ein anderes Thema.Überprüfen Sie auch diese Antwort.
Aktualisieren: Zur Laufzeit die ?
Markierungen werden durch den von Ihnen angegebenen Wert ersetzt ?
wird durch ersetzt 1
.Auch das query
ist die relationale Abfrage, der zweite Teil, nachdem die erste Abfrage das Laden abgeschlossen hat id
s aus dem posts
Tisch.Versuchen Sie stattdessen Folgendes, um alle Abfrageprotokolle anzuzeigen:
$queries = \DB::getQueryLog();
dd($queries);
Sie können die letzten beiden Abfragen überprüfen, um die Abfragen für den folgenden Aufruf zu debuggen:
$response = $this->posts
->where('author_id', '=', 1)
->with(array('postComments' => function($query) {
$query->where('comment_type', '=', 1);
}))
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();
Update nach Klarstellung:
Sie können so etwas verwenden, wenn Sie eine Setup-Beziehung in Ihrem haben Posts
Modell:
// $this->posts->with(...) is similar to Posts::with(...)
// if you are calling it directly without repository class
$this->posts->with(array('comments' =. function($q) {
$q->where('comment_type', 1);
}))
->orderBy('created_at', 'DESC')->limit($itemno)->get();
Damit es funktioniert, müssen Sie die Beziehung in Ihrem deklarieren Posts
(Versuchen Sie, einen Namen im Singular zu verwenden Post
wenn möglich) Modell:
public function comments()
{
return $this->hasmany('Comment');
}
Dein Comment
Das Modell sollte so aussehen:
class Comment extends Eloquent {
protected $table = 'post_comments';
}