Laravel elocuente y relación.
-
20-12-2019 - |
Pregunta
Tengo un código:
$response = $this->posts
->where('author_id', '=', 1)
->with(array('postComments' => function($query) {
$query->where('comment_type', '=', 1);
}))
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();
Y cuando registré esta consulta con:
$queries = \DB::getQueryLog();
$last_query = end($queries);
\Log::info($last_query);
En el archivo de registro veo lo siguiente:
"select * from `post_comments` where `post_comments`.`post_id` in (?, ?, ?, ?) and `comment_type` <> ?"
¿Por qué aparece el signo de interrogación para comment_type en la consulta?
Actualización n.º 1:
Reemplacé el código actual con el siguiente y obtengo lo que quiero.Pero no estoy seguro de que esté bien.Quizás existan muchas soluciones mejores y más agradables.
$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();
Solución
Detrás de escena el DOP se está utilizando y es la forma en que PDO
hace como una consulta preparada, por ejemplo, marque esto:
$title = 'Laravel%';
$author = 'John%';
$sql = "SELECT * FROM books WHERE title like ? AND author like ? ";
$q = $conn->prepare($sql);
$q->execute(array($title,$author));
En el tiempo de ejecución durante la ejecución de la consulta por execute()
el ?
Las marcas serán reemplazadas con el valor aprobado. execute(array(...))
. Laravel/Eloquent
usos PDO
y es un comportamiento normal en PDO
(Objetos de datos PHP).Hay otra forma que se usa en PDO
, que lleva el nombre parameter/placeholder
como :totle
se utiliza en lugar de ?
.Lea más sobre esto en el enlace dado, es otro tema.También verifique esta respuesta.
Actualizar: En el tiempo de ejecución el ?
Las marcas serán reemplazadas por el valor que usted proporcionó, por lo que ?
será reemplazado por 1
.También esto query
es la consulta relacional, la segunda parte después de que la primera consulta haya terminado de cargar el id
s de la posts
mesa.Para ver todos los registros de consultas, intente esto en su lugar:
$queries = \DB::getQueryLog();
dd($queries);
Puede consultar las dos últimas consultas para depurar las consultas de la siguiente llamada:
$response = $this->posts
->where('author_id', '=', 1)
->with(array('postComments' => function($query) {
$query->where('comment_type', '=', 1);
}))
->orderBy('created_at', 'DESC')
->limit($itemno)
->get();
Actualización después de la aclaración:
Puede usar algo como esto si tiene una relación de configuración en su Posts
modelo:
// $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();
Para que funcione necesitas declarar la relación en tu Posts
(Intenta usar un nombre singular Post
si es posible) modelo:
public function comments()
{
return $this->hasmany('Comment');
}
Su Comment
el modelo debería ser así:
class Comment extends Eloquent {
protected $table = 'post_comments';
}