Вопрос

У меня есть код:

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

И когда я зарегистрировал этот запрос с помощью:

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

В файле журнала я вижу следующее:

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

Почему в запросе стоит вопросительный знак для comment_type?

Обновление №1:

Я заменил текущий код следующим и получаю то, что хочу.Но я не уверен, что это нормально.Возможно, существует гораздо лучшее, приятнее решение.

$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();
Это было полезно?

Решение

За сценой PDO используется, и это тот способ, которым PDO выполняет в качестве подготовленного запроса, например, проверку этого:

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

Во время выполнения запроса с помощью execute() тот самый ? метки будут заменены на переданное значение execute(array(...)). Laravel/Eloquent использование PDO и это нормальное поведение в PDO (Объекты данных PHP).Есть еще один способ, который используется в PDO, который называется parameter/placeholder Нравится :totle используется вместо ?.Подробнее об этом читайте по данной ссылке, это уже другая тема.Также проверьте этот ответ.

Обновить: Во время выполнения ? метки будут заменены на указанное вами значение, так что ? будет заменен на 1.Также это query это реляционный запрос, вторая часть после того, как первый запрос завершил загрузку idы из posts таблица.Чтобы просмотреть все журналы запросов, попробуйте вместо этого следующее:

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

Вы можете проверить последние два запроса, чтобы отладить запросы для следующего вызова:

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

Обновление после уточнения:

Вы можете использовать что-то вроде этого, если у вас есть отношение setup в вашем 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();

Чтобы это заработало, вам нужно объявить об отношениях в вашем Posts (Старайтесь использовать имя в единственном числе Post если возможно) модель:

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

Ваш Comment модель должна быть такой:

class Comment extends Eloquent {
    protected $table = 'post_comments';
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top