Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 15.07.2014 11:03:06

Андрей

Атрибуты в eloquet

Создал атрибут
public function getTotalIpAttribute() {
        return $this->hasMany('ip','id_page')->count();
    }
Теперь он мне в foreach во вьюхе доступен как item.total_count ето шаблонизатор twig

Но смотрю теперь в дебаге ларавела, что каждый count создал отдельный запрос, но это же не правильно;

Можно ли както засунуть, как результат одного главного запроса с помощью eloquet, как обычным запросом знаю, но хочется узнать, как это с помощью ORM

#2 15.07.2014 12:25:18

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Атрибуты в eloquet

Если нужно именно через атрибут попробуйте закэшировать ваш запрос. Как-то так:

PHP
public function getTotalIpAttribute()
{
  return 
Cache::rememberForever('totalIp', function ()
     {
       return 
$this->hasMany('ip','id_page')->count();
    });
}

Правда, встает проблема актуальности данных в кэше.

Не в сети

#3 15.07.2014 12:39:10

Андрей

Re: Атрибуты в eloquet

Я и без атрибута согласен, просто не понимаю, как сделать чистый запрос с помощью 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

#4 15.07.2014 12:51:22

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Атрибуты в eloquet

Напишите базовую структуру ваших таблиц и что вы хотите получить

Не в сети

#5 15.07.2014 13:09:24

Андрей

Re: Атрибуты в eloquet

Хочу переделать запрос на 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 запроса, а с количеством вообще не догоняю, как акуратно их выцеплять

#6 16.07.2014 14:30:06

Игорь

Re: Атрибуты в eloquet

Ну вот же у вас верный вариант:

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'));

Подвал раздела