Laravel eloquente e relazione
-
20-12-2019 - |
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();
. 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 id
s 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';
}
.