Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Создал атрибут
public function getTotalIpAttribute() {
return $this->hasMany('ip','id_page')->count();
}
Теперь он мне в foreach во вьюхе доступен как item.total_count ето шаблонизатор twig
Но смотрю теперь в дебаге ларавела, что каждый count создал отдельный запрос, но это же не правильно;
Можно ли както засунуть, как результат одного главного запроса с помощью eloquet, как обычным запросом знаю, но хочется узнать, как это с помощью ORM
Не в сети
Я и без атрибута согласен, просто не понимаю, как сделать чистый запрос с помощью ORM, не вытаскивать все данные подряд, а только количество айди, если вставляю
$test = Post::with(array(
'ip' => function($query) {
$query->select(DB:raw('count(ip.id) as shows'));
}
))
Вернется 0;
Так
$test = Post::with(array(
'ip' => function($query) {
$query->select('*',DB:raw('count(ip.id) as shows'));
}
))
Вернуться ненужные куча строк, и в каждой строке по возрастанию будет показана shows
Не в сети
Хочу переделать запрос на ORM
public static function get_posts($article){
$posts = Post::leftJoin('post_tag', function($join) {
$join->on('posts.id', '=', 'post_tag.post_id');
})
->leftJoin('tags', function($join) {
$join->on('post_tag.tag_id', '=', 'tags.id');
})
->leftJoin('post_category', function($join) {
$join->on('posts.category_id', '=', 'post_category.id');
})
->where('posts.is_article', $article)
->where('posts.active', 1)
->select('posts.*', 'post_category.category AS category_name', DB::raw('
group_concat( tags.tag SEPARATOR ", " ) AS tags,
(SELECT COUNT(comments.id) FROM comments WHERE comments.post_id = posts.id ) AS count_comments,
(SELECT COUNT(ip.id_ip) FROM ip WHERE ip.id_page = posts.id ) AS shows'))
->groupBy('posts.id')
->distinct()
->paginate(10);
return $posts;
}
Просто через ORM поучается где то 4 запроса, а с количеством вообще не догоняю, как акуратно их выцеплять
Ну вот же у вас верный вариант:
Post::with(array(
'ip' => function($query) {
$query->select('*',DB:raw('count(ip.id) as shows'));
}
))
Если нужно только shows, так уберите *, оставьте только $query->select(DB:raw('count(ip.id) as shows'));
Страницы 1