Grid hasMany

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
borison89
Сообщения: 23
Зарегистрирован: 2016.04.14, 17:08

Grid hasMany

Сообщение borison89 »

доброго времени суток

начал изучать данный фреймворк и у меня появилось проблема с GridView при выводе связанных таблиц.


имею 2 модели сгенерированные gii:
(у меня всё более ёмко, потому количество полей сокращу)

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

class Tickets extends \yii\db\ActiveRecord
....................
    public function getTicketHistories()
    {
        return $this->hasMany(TicketHistory::className(), ['TicketID' => 'id']);
    }
    
где хранится
id, start_date(дата открытия), start_text (первичный текст)

и

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

class TicketHistory extends \yii\db\ActiveRecord


где хранится 
id, TicketID (2й ключ), edit_date, edit_text, edit_version, current(0 или 1)
имею сгенерированный Grid, в котором для модели Ticket нужно будет подтащить последнее значение из TicketHistory

грубо говоря в SQL значения, которые должны пойти в грид должны выглядеть так:

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

SELECT
    *
FROM
    Tickets JOIN TicketHistory
WHERE
    Tickets.id = TicketHistory.TicketID AND TicketHistory.Current = 1
что получилось у меня:

я с помощью жадной загрузки подгрузил в модель поиска TicketSearch

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

        $query = tickets::find()
                ->With(['ticketHistories']);
а дальнейшие andWhere я не смог прописать
либо нужно запросы конфигурировать в самом гриде?

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

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

 [
                'header' => 'Number Edits',
                'value' => function($data) {
                    return $data->getTicketHistories()->count();
                }
            ],
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Grid hasMany

Сообщение zelenin »

->With - зачем большую W поставили?

так и пишите:
andWhere('Tickets.id = TicketHistory.TicketID AND TicketHistory.Current = 1')
borison89
Сообщения: 23
Зарегистрирован: 2016.04.14, 17:08

Re: Grid hasMany

Сообщение borison89 »

тогда не очень понял куда писать?

просто если я соберу к примеру

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

        $query = tickets::find()
                ->with(['ticketHistories'])
                ->andWhere('TicketHistory.Current = 1'); 
то фреймворк выругается (ибо пытается искать по Tickets)

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

SELECT COUNT(*) FROM `Tickets` WHERE TicketHistory.Current = 1
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Grid hasMany

Сообщение zelenin »

надо не with, а joinWith, тогда запрос сформируется с джойном
borison89
Сообщения: 23
Зарегистрирован: 2016.04.14, 17:08

Re: Grid hasMany

Сообщение borison89 »

zelenin писал(а):надо не with, а joinWith, тогда запрос сформируется с джойном
такс, с частью здорово - подразобрался

а чтобы ещё отсечь из 2й таблицы TicketHistory значения, отличные от current = 1?
уже в самом гриде вылавливать foreach и убирать?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Grid hasMany

Сообщение zelenin »

borison89 писал(а):а чтобы ещё отсечь из 2й таблицы TicketHistory значения, отличные от current = 1?
так условие добавьте
borison89 писал(а):уже в самом гриде вылавливать foreach и убирать?
в гриде нельзя foreach делать
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Grid hasMany

Сообщение Dominus »

а чтобы ещё отсечь из 2й таблицы TicketHistory значения, отличные от current = 1?
Может так?)

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

$query = tickets::find()->joinWith('ticketHistories')->where('curent != :Curent', [':Curent' => 1])->all();
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
borison89
Сообщения: 23
Зарегистрирован: 2016.04.14, 17:08

Re: Grid hasMany

Сообщение borison89 »

в общем в своём частном случае сделал так:
в самом гридвью указал новый дата провайдер, в котором указал анонимную функцию со вложенным критерием:

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

        'dataProvider' => new ActiveDataProvider(['query' => Tickets::find()->with([
                'ticketHistories' => function (Query $q) {
                    $q->where(['TicketCurrent' => 1]);
                }])]), 
Ответить