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();
¿Fue útil?

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 ids 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';
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top