Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день, возможно ли в Laravel получить количество связанных данных вместе с данными основного запроса стандартными методами?
Проблема в следующем:
Имеется таблица постов и таблица комментариев. Необходимо вернуть поля id и votes из таблицы постов, а так же количество комментариев в JSON формате.
Пока все попытки свелись к следующему:
$result = Post::select('id', 'votes')->with('comments')->get();
return Json::encode($result);
Но на выходе естественно получаем не количество а сами данные из таблицы комментариев. Как быть?
Не в сети
Вопрос все еще актуален: как лучше всего получить данные и привести их в json формат если необходимо получить данные из одной таблицы, а так же количество связанных данных из другой?
Первым же решением было решение в лоб: пробежаться по полученным данным и вручную группировать их в json формате. Подозреваю, что это далеко не единственное решение и не самое лучшее.
Не в сети
И да, я догадываюсь что нужно использовать Join, но в БД не силен, поэтому хотелось бы узнать верны ли мои догадки и в какую все-таки сторону стоит смотреть. Что бы понять хватит пары примеров.
Не в сети
$result = DB::table('posts')
->join('comments', 'posts.id', '=', 'comments.post_id')
->select('posts.*', 'COUNT(comments.id)')
->get();
Не?
Не в сети
Благодарю, чуть позже испытаю. Не силен в работе с бд, но понять не могу ведь проще не получать все поля и не join'ить их, а просто подсчитать количество(к примеру по полю post.id) или бд сама разберется и на больших данных ей пофиг все не все join'ить?
Не в сети
Благодарю, чуть позже испытаю. Не силен в работе с бд, но понять не могу ведь проще не получать все поля и не join'ить их, а просто подсчитать количество(к примеру по полю post.id) или бд сама разберется и на больших данных ей пофиг все не все join'ить?
Да, забыл, что можно еще указать where(), где будет указан, например, id поста и посчитаются только его комментарии. А если надо просто посчитать кол-во всех комментариев вообще, то зачем придумывать какие-то усложнения и просто не посчитать отдельным, простым запросом?
Не в сети
Не все, а как Вы верно поняли для каждого поста отправить количество его комментариев
Не в сети
Не в сети
Эмммм, в том и вопрос: Как?
post HasMany comment
comment BelongTo post
А что дальше? Как получить из этого массив 'ключ' => 'значение' что бы преобразовать потом без проблем в json(или сразу получить json) с полями id поста и количества связанных с ним комментариев и проголосовавших(поля votes тоже больше нет)
Не в сети
вопрос открыт
$result = DB::table('posts')
->join('comments', 'posts.id', '=', 'comments.post_id')
->select('posts.*', 'COUNT(comments.id)')
->get();Не?
Не, потому что не вернёт записи без камментов ;-)
Не в сети
во первых чё вы все боитесь ОРМ ?
Не в сети
во вторых.
есть модель Постов.
есть модель Камментов
связать согласно доументации не?
Не в сети
и в третьих
вариант "упрощёнка", но с нагрузкой на сервер и излишними итерациями
(не, не ждите готового решения, пора самим думать, а не ждать что кто-то за вас чего-то там сделает)
$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)
Не в сети
И в последнюю очередь - если пишешь используя ORM, то старайся не скатываться к DB::
Вообще.
Используй Модель, как несущую таблицу, а дальше только от неё по связям.
Я тоже год назад думал что орм хреново построено, - ан нет. просто хреново документировано.
Не в сети
Страницы 1