Как достучаться в ActiveDataProvider до полей из заJOINой таблицы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Как достучаться в ActiveDataProvider до полей из заJOINой таблицы

Сообщение Chelobaka »

Здравствуйте,
Есть таблица Patient и Payment. Отношение один ко многим.


Есть запрос вида:

Код: Выделить всё

 $provider = new ActiveDataProvider([
            'query' => Patient::find()
            ->select(['COUNT(payment.status) AS status_count', 'patient.id', 'patient_id', 'first_name', 'last_name', 'date'])
            ->leftJoin('payment', 'patient.id = payment.patient_id')
            ->groupBy(['first_name'])
            ->having(['status_count' => 1])
            ->andWhere(['>','date', '20190101'])
            ->orderBy('patient_id')]);
            
            
Поля 'date' и 'patient_id' не принадлежат модели Patient. Как их можно вытащить для дальнейшего использования в activeGrid?
Я попробовал сделать так:

Код: Выделить всё

class Patient extends \yii\db\ActiveRecord
{
    public $value;

    public function __set($name, $value)
    {
        $this->value = $value;
    }
....
Думал что какая то из переменных запишется через магию __set но в итоге ничего не выводится. Точнее даже нет попытки добавить какое то значение через метод __set().
Как правильно объединять данные двух таблиц что бы в последствии иметь доступ ко всем выбранным полям?
Стандартный механизм поиска в диапазоне месяца?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Как достучаться в ActiveDataProvider до полей из заJOINой таблицы

Сообщение Loveorigami »

Поля 'date' и 'patient_id' не принадлежат модели Patient.
Как не принадлежат, если по запросу - принадлежат

Patient::find()
->select(['COUNT(payment.status) AS status_count', 'patient.id', 'patient_id', 'first_name', 'last_name', 'date'])
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как достучаться в ActiveDataProvider до полей из заJOINой таблицы

Сообщение ElisDN »

Loveorigami писал(а): 2019.02.15, 09:25Как не принадлежат, если по запросу - принадлежат
По запросу из leftJoin видно, что не принадлежат.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Как достучаться в ActiveDataProvider до полей из заJOINой таблицы

Сообщение Alexum »

Chelobaka писал(а): 2019.02.14, 22:19 Как правильно объединять данные двух таблиц что бы в последствии иметь доступ ко всем выбранным полям?
Если вам нужны именно объекты ActiveRecord, то следует объявить связь между моделями и работать через неё. В своём классическом виде ActiveRecord загружает в себя только те атрибуты, набор которых получен из схемы БД. Дополнительный атрибут можно создать добавив публичное поле в класс модели и играться с его геттером/сеттером. Для различных счётчиков это допустимо, но вот дублировать поля из других моделей и засорять основную модель - такое себе. Если в поисковом запросе использовались связи, то в объекты ActiveRecord так же будут подгружены (и доступны через эти связи) и связанные объекты других моделей. При всём при этом стоит учитывать, что для наполнения всех связанных моделей в любом случае последует отдельный запрос к БД (по массиву id).
Если же объекты ActiveRecord не нужны и есть сложный запрос, то для нужд большинства табличных виджетов подойдёт и SqlDataProvider, где одним запросом можно получить все данные.

https://www.yiiframework.com/doc/guide/ ... ional-data
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Как достучаться в ActiveDataProvider до полей из заJOINой таблицы

Сообщение Loveorigami »

Loveorigami писал(а): 2019.02.15, 09:25
Поля 'date' и 'patient_id' не принадлежат модели Patient.
Как не принадлежат, если по запросу - принадлежат

Patient::find()
->select(['COUNT(payment.status) AS status_count', 'patient.id', 'patient_id', 'first_name', 'last_name', 'date'])
Тогда логичнее написать было payment.patient_id и payment.date
Ответить