Laravel по-русски

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

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

#1 27.07.2015 09:38:51

Количество связанных данных одним запросом

Добрый день, возможно ли в Laravel получить количество связанных данных вместе с данными основного запроса стандартными методами?

Проблема в следующем:
Имеется таблица постов и таблица комментариев. Необходимо вернуть поля id и votes из таблицы постов, а так же количество комментариев в JSON формате.

Пока все попытки свелись к следующему:

$result = Post::select('id', 'votes')->with('comments')->get();
return Json::encode($result);

Но на выходе естественно получаем не количество а сами данные из таблицы комментариев. Как быть?

Не в сети

#2 05.08.2015 13:55:59

Re: Количество связанных данных одним запросом

Вопрос все еще актуален: как лучше всего получить данные и привести их в json формат если необходимо получить данные из одной таблицы, а так же количество связанных данных из другой?

Первым же решением было решение в лоб: пробежаться по полученным данным и вручную группировать их в json формате. Подозреваю, что это далеко не единственное решение и не самое лучшее.

Не в сети

#3 05.08.2015 14:39:00

Re: Количество связанных данных одним запросом

И да, я догадываюсь что нужно использовать Join, но в БД не силен, поэтому хотелось бы узнать верны ли мои догадки и в какую все-таки сторону стоит смотреть. Что бы понять хватит пары примеров.

Не в сети

#4 11.08.2015 11:48:07

Re: Количество связанных данных одним запросом

$result = DB::table('posts')
            ->join('comments', 'posts.id', '=', 'comments.post_id')
            ->select('posts.*', 'COUNT(comments.id)')
            ->get();

Не?

Не в сети

#5 11.08.2015 13:30:53

Re: Количество связанных данных одним запросом

Благодарю, чуть позже испытаю. Не силен в работе с бд, но понять не могу ведь проще не получать все поля и не join'ить их, а просто подсчитать количество(к примеру по полю post.id) или бд сама разберется и на больших данных ей пофиг все не все join'ить?

Не в сети

#6 11.08.2015 13:40:46

Re: Количество связанных данных одним запросом

TuX560 пишет:

Благодарю, чуть позже испытаю. Не силен в работе с бд, но понять не могу ведь проще не получать все поля и не join'ить их, а просто подсчитать количество(к примеру по полю post.id) или бд сама разберется и на больших данных ей пофиг все не все join'ить?

Да, забыл, что можно еще указать where(), где будет указан, например, id поста и посчитаются только его комментарии. А если надо просто посчитать кол-во всех комментариев вообще, то зачем придумывать какие-то усложнения и просто не посчитать отдельным, простым запросом?

Не в сети

#7 12.08.2015 09:31:18

Re: Количество связанных данных одним запросом

Не все, а как Вы верно поняли для каждого поста отправить количество его комментариев

Не в сети

#8 12.08.2015 09:38:15

Arat
Откуда: Киев
Сообщений: 116

Re: Количество связанных данных одним запросом

Эмммм, а использовать Eloquent и отношения не получилось?

Не в сети

#9 12.08.2015 14:17:20

Re: Количество связанных данных одним запросом

Эмммм, в том и вопрос: Как?
post HasMany comment
comment BelongTo post

А что дальше? Как получить из этого массив 'ключ' => 'значение' что бы преобразовать потом без проблем в json(или сразу получить json) с полями id поста и количества связанных с ним комментариев и проголосовавших(поля votes тоже больше нет)

Не в сети

#10 21.11.2015 23:41:26

Fz61Sqo6VDLd3TCzZtQonWO1Y

Re: Количество связанных данных одним запросом

вопрос открыт

#11 08.12.2015 14:45:28

Re: Количество связанных данных одним запросом

duante пишет:

$result = DB::table('posts')
            ->join('comments', 'posts.id', '=', 'comments.post_id')
            ->select('posts.*', 'COUNT(comments.id)')
            ->get();

Не?

Не, потому что не вернёт записи без камментов ;-)

Не в сети

#12 08.12.2015 14:45:53

Re: Количество связанных данных одним запросом

во первых чё вы все боитесь ОРМ ?

Не в сети

#13 08.12.2015 14:46:26

Re: Количество связанных данных одним запросом

во вторых.

есть модель Постов.
есть модель Камментов

связать согласно доументации не?

Не в сети

#14 08.12.2015 14:52:07

Re: Количество связанных данных одним запросом

и в третьих

вариант "упрощёнка", но с нагрузкой на сервер и излишними итерациями
(не, не ждите готового решения, пора самим думать, а не ждать что кто-то за вас чего-то там сделает)

$Posts = Post::lists('id','votes')->get();
foreach($Posts as $Post)
{
    $Posts->countCommets = $Post->countCommets();
}
$result = $Posts->toArray();
// если дальше код пишешь, то обязательно делай unset($Posts,$Post); ненужного - высвобождай память
class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo('Post');
    }
}
class Post extends Model
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
    public function countComments()
    {
        return $this->hasMany('Comment')->count();
    }
}

Изменено hzone (08.12.2015 14:53:39)

Не в сети

#15 08.12.2015 14:55:33

Re: Количество связанных данных одним запросом

И в последнюю очередь - если пишешь используя ORM, то старайся не скатываться к DB::
Вообще.

Используй Модель, как несущую таблицу, а дальше только от неё по связям.

Я тоже год назад думал что орм хреново построено, - ан нет. просто хреново документировано.

Не в сети

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