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();
War es hilfreich?

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 ids 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';
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top