Domanda

Ho un codice:

$response = $this->posts
    ->where('author_id', '=', 1)
    ->with(array('postComments' => function($query) {
        $query->where('comment_type', '=', 1);
    }))
    ->orderBy('created_at', 'DESC')
    ->limit($itemno)
    ->get();
.

E quando ho registrato questa query con:

$queries = \DB::getQueryLog();
$last_query = end($queries);
\Log::info($last_query);
.

In File di registro I vedo Seguire:

"select * from `post_comments` where `post_comments`.`post_id` in (?, ?, ?, ?) and `comment_type` <> ?"
.

Perché è il punto interrogativo per commenti_type nella query?

Aggiorna # 1:

Ho sostituito il codice corrente con il seguente e ottengo quello che voglio.Ma non sono sicuro che sia ok.Forse esiste molte migliori, magre soluzioni.

$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();
.

È stato utile?

Soluzione

Dietro la scena il DOP viene utilizzato ed è il modo in cui PDO fa come query preparata, ad esempio controlla questo:

$title = 'Laravel%';
$author = 'John%';
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));
.

Nel tempo di esecuzione durante l'esecuzione della query di execute() I segni ? verranno sostituiti con valore superato execute(array(...)). Laravel/Eloquent utilizza PDO ed è normale comportamento in PDO (oggetti dati PHP). C'è un altro modo utilizzato in PDO, il che è denominato parameter/placeholder come :totle viene utilizzato al posto di ?. Leggi di più sul link dato, è un altro argomento. Controlla anche Questa risposta . / P >.

Aggiornamento: Nel tempo di esecuzione I segni ? verranno sostituiti con il valore fornito, quindi ? verrà sostituito con 1. Anche questo query è la query relazionale, la seconda parte dopo la prima query ha eseguito il caricamento dei ids dalla tabella posts. Per vedere tutti i registri di query, prova questo invece:

$queries = \DB::getQueryLog();
dd($queries);
.

È possibile controllare le ultime due query per eseguire il debug delle query per la seguente chiamata:

$response = $this->posts
->where('author_id', '=', 1)
->with(array('postComments' => function($query) {
    $query->where('comment_type', '=', 1);
}))
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();
.

Aggiornamento dopo chiarimento:

È possibile utilizzare qualcosa del genere se hai la relazione di installazione nel modello Posts:

// $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();
.

Per farlo funzionare è necessario dichiarare la relazione nel tuo Posts (provare a utilizzare il nome singolare Post se possibile) Modello:

public function comments()
{
    return $this->hasmany('Comment');
}
.

Il tuo modello Comment dovrebbe essere così:

class Comment extends Eloquent {
    protected $table = 'post_comments';
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top