Laravel по-русски

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

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

#1 28.04.2016 13:42:10

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

Связи моделей и детальная выборка по базе

Всем привет!
Нужна подсказка опытных.
Есть две модели Users и Alerts. Они связаны между собой пивотной таблицей alert_user.
Для каждого юзера достаю нужные алерты через

PHP
$alerts User::find($user->id)->alerts;

У меня в таблице alerts есть поле viewed с булиновским значением. Как мнее достать для юзера алерты, которые со значением в таблице viewed == false?
Через

PHP
$alerts User::find($user->id)->alerts;
$alerts $alerts->where('viewed'false);

возвращает пустую коллекцию, хотя это не так.

Не в сети

#2 28.04.2016 13:49:18

Re: Связи моделей и детальная выборка по базе

>>$alerts = User::find($user->id)->alerts;
Если есть уже  инстанс юзера $user
Зачем еще раз  его находить?

Попробуй
$alerts  = $user->alerts()->where('viewed', false)->get();

Не в сети

#3 28.04.2016 13:52:06

Re: Связи моделей и детальная выборка по базе

А вообще в отношениях что-то явно не так.
>>Есть две модели Users и Alerts. Они связаны между собой пивотной таблицей alert_user.

Это значит отношение м2м
Те один алерт может относиться ко многим пользователям? Тогда поле viewed на самой модели Alert нерелевантно. Надо делать колонку viewed на связующей таблице alert_user

Изменено VitalN (28.04.2016 13:52:30)

Не в сети

#4 28.04.2016 13:56:03

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

Re: Связи моделей и детальная выборка по базе

А вообще в отношениях что-то явно не так.
Это значит отношение м2м
Те один алерт может относиться ко многим пользователям? Тогда поле viewed на самой модели Alert нерелевантно. Надо делать колонку viewed на связующей таблице alert_user

Именно, алерт относится ко многим юзерам (многие юзеры имеют алерт). В обеих талицах пока есть поле viewed.
Бьет такую ошибку:

PHP
SQLSTATE[23000]: Integrity constraint violation1052 Column 'viewed' in where clause is ambiguous (SQLselect `alerts`.*, `alert_user`.`user_id` as `pivot_user_id`, `alert_user`.`alert_id` as `pivot_alert_idfrom `alertsinner join `alert_useron `alerts`.`id` = `alert_user`.`alert_idwhere `alert_user`.`user_id` = and `viewed` = 0)

Изменено Arat (28.04.2016 13:56:43)

Не в сети

#5 28.04.2016 14:08:06

Re: Связи моделей и детальная выборка по базе

Так тебе условие по viewed надо на пивотную таблицу или alert ?

Не в сети

#6 28.04.2016 14:09:07

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

Re: Связи моделей и детальная выборка по базе

На пивотную.

Не в сети

#7 28.04.2016 14:10:23

Re: Связи моделей и детальная выборка по базе

тогда
$alerts  = $user->alerts()->wherePivot('viewed', false)->get();

Не в сети

#8 28.04.2016 14:17:23

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

Re: Связи моделей и детальная выборка по базе

Ооо! Пошло! огромное спасибо! Вот про wherePivot() метод даже не знал

Не в сети

#9 28.04.2016 14:55:38

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

Re: Связи моделей и детальная выборка по базе

Еще в догонку вопрос.
А если мне нужно теперь вытащить сам флаг viewed из пивотной таблицы для использования в шаблоне, как я могу это сделать?

Не в сети

#10 28.04.2016 14:59:28

Re: Связи моделей и детальная выборка по базе

Как раз  перевожу эту доку  https://laravel.com/docs/5.2/eloquent-r … ny-to-many для сообщества
---
По умолчанию, в объекте `pivot` будут присутствовать только ключи  моделей. Если ваша связующая таблица содержит дополнительные атрибуты, их необходимо перечислить при описании отношения:

    return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');


Думаю, пока суть да дело надо будет в виде статьи выложить у себя )

Не в сети

#11 28.04.2016 15:01:06

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

Re: Связи моделей и детальная выборка по базе

Да, было бы супер! Открыл твой сайт для себя. Клевый!

Не в сети

#12 28.04.2016 18:51:29

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

Re: Связи моделей и детальная выборка по базе

Продолжаем разговор…
Делаю теперь пагинацию по выборке выше:

PHP
$user auth()->user();
$alerts  $user->alerts()->wherePivot('viewed'true)->paginate(10);

Во вьюхе пишу (все по документации):

PHP
{!! $alerts->links() !!}

Получаю на выхлоп:

PHP
ErrorException in Macroable.php line 81:
Method links does not exist.

Не в сети

#13 28.04.2016 19:13:23

Re: Связи моделей и детальная выборка по базе

А сделай дамп $alerts во вью, он там что вообще?
Ты его передать туда не забыл? )

Не в сети

#14 28.04.2016 19:41:54

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

Re: Связи моделей и детальная выборка по базе

Во вьюхе дампится аж бегом. Оно там массив объектов самих алертов. Конечно, я передал алерты туда.

Не в сети

#15 28.04.2016 20:06:42

Re: Связи моделей и детальная выборка по базе

Ну у массива не может быть конечно метода links ()
Код точно так выглядит как указал?
$alerts  = $user->alerts()->wherePivot('viewed', true)->paginate(10);

Запости весь метод контродллера

Не в сети

#16 29.04.2016 09:22:55

WebDev

Re: Связи моделей и детальная выборка по базе

VitalN пишет:

Как раз  перевожу эту доку  https://laravel.com/docs/5.2/eloquent-r … ny-to-many для сообщества
---
По умолчанию, в объекте `pivot` будут присутствовать только ключи  моделей. Если ваша связующая таблица содержит дополнительные атрибуты, их необходимо перечислить при описании отношения:

    return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');


Думаю, пока суть да дело надо будет в виде статьи выложить у себя )

Думаю будет очень полезно еще добавить в доки кроме оригинального перевода, еще информацию как применить мутаторы к пивот таблице. Вчера столкнулся с этим, долго помучился, в итоге все доволи просто: наследуете пивот таблицу от класса Pivot и переопределяете в обращающейся к пивот таблице метод newPivot, возвращающий новый объект модели пивот. (надеюсь понятно smile)

#17 29.04.2016 10:51:49

Re: Связи моделей и детальная выборка по базе

WebDev,
Можете в виде коммента добавить https://laravel-news.ru/blog/tutorials/ … t-relation
Информация полезная!

Не в сети

#18 29.04.2016 12:40:59

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

Re: Связи моделей и детальная выборка по базе

Запости весь метод контродллера

PHP
public function showArchive() {
      
$user auth()->user();
      
$alerts  $user->alerts()->wherePivot('viewed'true)->paginate(10);
      
$alerts $alerts->sortByDesc('created_at');

      return 
view('pages.alerts.index', ['alerts' => $alerts]);
    }

Вот этот метод контроллера

Не в сети

#19 06.05.2016 20:13:13

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

Re: Связи моделей и детальная выборка по базе

Таки не работает постраничка. А может какой-то сторонний пакет для ларавела давать такую проблему?

Не в сети

#20 12.05.2016 16:47:58

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

Re: Связи моделей и детальная выборка по базе

Нашел в чем проблема с моей пагинацией.

PHP
$alerts $alerts->sortByDesc('created_at');

Из-за вот этой сортировки не пускало к методу links() почему-то. Теперь ищу как все же отсортировать мою коллекцию с пагинацией…

Не в сети

#21 12.05.2016 18:45:42

Re: Связи моделей и детальная выборка по базе

попробуй
$alerts  = $user->alerts()->wherePivot('viewed', true)->sortByDesc('created_at')->paginate(10);

Не в сети

#22 13.05.2016 10:10:43

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

Re: Связи моделей и детальная выборка по базе

Не сортирует, но и ошибки не выводит.

Не в сети

#23 13.05.2016 10:12:29

Re: Связи моделей и детальная выборка по базе

Запрос посмотри какой получается

Не в сети

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