Laravel по-русски

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

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

#1 29.05.2015 17:21:09

пивоты, усложнение жизни

на примере тегов.
есть много разных сущностей, к которым надо привязать тег.
пример: пользователь, блог, пост, картинка, чего-то ещё.
делать много пивотов и читать их сложно и долго
видел ли кто-то более разумное решение, чем 100500 пивотов?

Не в сети

#2 30.05.2015 15:40:04

Re: пивоты, усложнение жизни

А polymorph-связи не подходят? Там как раз можно привязать один тег к куче сущностей.

Не в сети

#3 01.06.2015 15:44:25

Re: пивоты, усложнение жизни

посоветуйте, как , используя любые связи (лучше примером) дёрнуть кол-во записей у ссылаемой записи.

пример
запись "мой блог", содержит 25 постов. нужно дёрнуть это количество. именно на orm
чёт у мну ролики за шарики едут...

а так, всё отлично, всё работает.

Не в сети

#4 01.06.2015 17:36:44

Re: пивоты, усложнение жизни

Так?

$count = $blog->posts->count()

Где posts - это связь сущности "blog" с сущностями "posts".

Не в сети

#5 02.06.2015 11:49:08

Re: пивоты, усложнение жизни

неее, для этого надо вытащить посты, потом считать их. нагрузка.

Не в сети

#6 03.06.2015 00:18:12

Re: пивоты, усложнение жизни

после каждого нового поста инкрементируй поле count в таБлице постов
тогда если нужно количество оно всегда под рукой

ну и полиморфы юзай конечно
удачи

Не в сети

#7 03.06.2015 11:46:59

Re: пивоты, усложнение жизни

не катит.
именно используя полиморфы хочу знать как каунтить.
есть в инете решения, но они громозские.

Не в сети

#8 04.06.2015 11:04:00

sofcase
Откуда: Одесса
Сообщений: 3

Re: пивоты, усложнение жизни

hzone пишет:

неее, для этого надо вытащить посты, потом считать их. нагрузка.

Вместо:

$count = $blog->posts->count()

Просто:

$count = $blog->posts()->count()

Это не будет загружать записи, а просто выполнит select count(*) ...

Не в сети

#9 04.06.2015 12:20:03

Re: пивоты, усложнение жизни

Однако интересное решение, НО.
Представь, что это нужно (в принципе других ТЗ не существет), чтобы показать во вьюшке, ради того, чтобы информировать сидящего перед монитором. Не более, ни менее.
И так уже MVC в ларе прозрачный до такой степени, что уже задумываешься "а нахрена".
Т.е. во вьюшке я должен сказать

{{$blog->posts()->count()}}

Согласитесь, что хоть и работает, но ЭТО НЕ ПРАВИЛЬНО !

Не в сети

#10 04.06.2015 12:25:10

Re: пивоты, усложнение жизни

пока использую следующее решение:

public function countPosts()
{
            return $this
                ->hasMany( 'App\Post', 'postable_id' )
                ->selectRaw( 'postable_id, count(*) as count' )
                ->where('postable_type', '=', 'App\Bort')
                ->groupBy('postable_id');
}
{{$blog->countPosts->first()->count}}

Это решение из инета и оно устраивает (пока) только по причине предварительного сбора данных на уровне контроллера/модели, а не дёрганья их из вьюшки

Не в сети

#11 04.06.2015 12:29:07

Re: пивоты, усложнение жизни

Админ! Переименуй плиз тему в "Сложные пивоты, полиморфы, их count() и другое"
Тема обещает быть интересной, если народ не слезет.

Не в сети

#12 05.06.2015 00:28:46

Re: пивоты, усложнение жизни

Есть один пакет для лайков
он основан на полиморфах
там используется два способа полиморфах
один morphTo MorphMany для связи лайков с разными таблицами(предметы/посты/вопросы)
второй morphTo MorphOne как раз для count()

используется просто :
$model->relatedmodel->count

там сохраняются все count() от всех таблиц
причем есть только два поля id/count

надеюсь это выход
удачи

Не в сети

#13 05.06.2015 09:19:25

Re: пивоты, усложнение жизни

Т.е. во вьюшке я должен сказать

{{$blog->posts()->count()}}

Согласитесь, что хоть и работает, но ЭТО НЕ ПРАВИЛЬНО !

Лучше в шаблон передавать из контроллера переменную, содержащую значение, которое возвратит этот метод.
А в шаблоне уже писать:

{{ $count }}

znack, отдельная связь (с отдельной таблицей) для количества элементов? Странно...

Не в сети

#14 05.06.2015 12:09:58

Re: пивоты, усложнение жизни

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

Не в сети

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