Проблема с поиском отношений Yii 1.1

<сильный>1. Таблица meeting

Название модели CoreMeeting

Поля id, title, start time, created_by

Отношение:

'MeetingParticipants' => array(self::HAS_MANY, 'MeetingParticipants', 'meeting_id'),

<сильный>2. Таблица core_meeting_participant

Название модели meeting_participant

Поля id, meeting_id, participant_id, group_id

Отношение:

 'meeting' => array(self::BELONGS_TO, 'CoreMeeting', 'meeting_id'),
 'group' => array(self::BELONGS_TO, 'MeetingGroup', 'group_id'),

<сильный>3. Таблица core_meeting_group

Название модели MeetingGroup

Поля id, group_name

Мой фильтр поиска в модели встречи:

public function search()
{
    
    $group=filter_var($_REQUEST['group'], FILTER_SANITIZE_STRING);//contain group name

    $criteria=new CDbCriteria;
    $user_id = Yii::app()->user->id;

    $criteria->compare('id',$this->id);
    $criteria->compare('title',$this->title,true);
    $criteria->with=array('MeetingParticipants'=>array("select"=>"*"),'MeetingParticipants.group'=>array('select'=>'id,group_name'));
    
    if(isset($this->start_time) && !empty($this->start_time))
    $criteria->compare('start_time',date("Y-m-d", strtotime($this->start_time)), true);

    $criteria->compare('created_by',$user_id);

    if(isset($group)&&!empty($group))
    $criteria->compare('group.group_name',$group);
    $criteria->together = true;


    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,

    ));
}

Я создал 4 встречи, на каждой встрече есть как минимум 5 участников, каждый участник принадлежит к группе встреч. Я хочу перечислить все собрания со следующим названием собрания, группами и временем собрания.

Моя проблема заключается в том, что если я включу $criteria->together = true;, если в собрании более 10 участников, будет отображаться только 1 собрание в виде сетки. Если я отключу это, будет показано все, но я не смогу выполнить поиск по названию собрания. Ссылка на скрипку SQL: http://sqlfiddle.com/#!9/fdaacf полный дамп SQL https://pastebin.com/NtpMuCpE


person Reneesh Kurian    schedule 15.04.2020    source источник


Ответы (1)


Документация по свойству CDbCriteria->together:

https://www.yiiframework.com/doc/api/1.1/CDbCriteria#together-detail

Должны ли сторонние таблицы объединяться с основной таблицей в одном SQL. Это свойство используется только в реляционных запросах AR для отношений HAS_MANY и MANY_MANY.

Как я вижу ваше отношение в модели CoreMeeting:

'group' => array(self::BELONGS_TO, 'MeetingGroup', 'group_id')

Очевидно, вы пытаетесь получить взаимно-однозначное (BELONGS_TO) отношение CoreMeeting -> MeetingGroup, глобально установив значение CDbCriteria->together = true; что не соответствует документации.

Я бы посоветовал вам, прежде всего, избавиться от этой глобальной настройки together на CDbCriteria и попробовать изменить предложение with следующим образом:

$criteria->with = [
    // this is your has-many relation (one meeting has several participants), thus we set here `together` to true
    'MeetingParticipants' => [
        'together' => true,
        'with' => [
            // this is your one-to-one relation (one participant has one group)
            'group'
        ]
    ]
];
person G.Spirov    schedule 15.04.2020
comment
не работает без проверки различий ссылка скрипта sql sqlfiddle.com/#!9/fdaacf полный sql дамп pastebin.com/NtpMuCpE - person Reneesh Kurian; 16.04.2020
comment
На самом деле, я думаю, что проблема не связана с SQL, после того как я увидел структуру вашей базы данных. Вы удалили глобальные $criteria-›together = true; ? Что значит без разницы, результаты сейчас агрегированы или поиск не работает? Пожалуйста, предоставьте более подробную информацию о том, что произошло после того, как вы изменили свой код. - person G.Spirov; 16.04.2020
comment
привет, пожалуйста, перейдите по ссылке для вывода после внесения изменений imagebin.ca/v/5JIYEeb0Um3l - person Reneesh Kurian; 16.04.2020
comment
проверьте это, если удалите критерии вместе, это обязательный вывод, но вы не можете выполнить поиск pasteboard.co/J42GnsT.png< /а> - person Reneesh Kurian; 16.04.2020
comment
$criteria-›group = 't.id'; Попробуйте добавить эту строку. Он будет группироваться по первичному ключу идентификатора CoreMeeting, что предотвратит агрегацию из отношения HAS_MANY и гарантирует уникальность первичной модели. - person G.Spirov; 16.04.2020
comment
которые показывают ошибку CDbCommand не удалось выполнить оператор SQL: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение № 8 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец «portalv2.MeetingParticipants.id», который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode=only_full_group_by. - person Reneesh Kurian; 16.04.2020
comment
Привет, проверьте, что sql t.id уже существует COUNT (*) FROM (SELECT t.id AS t0_c0, `. Я новичок в yii, поэтому я не знаю, как явно указать идентификатор в yii. Вы можете мне помочь? - person Reneesh Kurian; 16.04.2020
comment
За кулисами это SQL, созданный из ActiveDataProvider для запроса общего количества результирующего набора. В большинстве случаев он похож на основной запрос из CDbCriteria, завернутый в select count(*) from ( CDbCriteria-›rawSql). Вот что я имел в виду, если вы группируете по t.id в своем запросе CDbCriteria, это изменит набор результатов общего подсчета, потому что группировка разбивает агрегацию, полученную из соединения с отношением HAS_MANY. - person G.Spirov; 16.04.2020
comment
Что вы имеете в виду под новым выпуском? - person G.Spirov; 16.04.2020
comment
как устранить эту ошибку: SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1055 Выражение № 8 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец «portalv2.MeetingParticipants.id»? - person Reneesh Kurian; 17.04.2020
comment
$criteria-›group = 't.id, core_meeting_participant.id'; - person G.Spirov; 17.04.2020
comment
не работает должным образом pasteboard.co/J4cMNDo.png проверить это - person Reneesh Kurian; 17.04.2020
comment
Давайте продолжим это обсуждение в чате. - person G.Spirov; 17.04.2020