【问题标题】:Yii 1.1 relationship search issueYii 1.1 关系搜索问题
【发布时间】:2020-04-15 10:21:44
【问题描述】:

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

【问题讨论】:

    标签: yii yii1.x


    【解决方案1】:

    CDbCriteria->together 属性的文档:

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

    外部表是否应在单个 SQL 中与主表连接。 此属性仅用于 HAS_MANY 和 MANY_MANY 关系的关系 AR 查询。

    我可以在CoreMeeting 模型中看到您的关系:

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

    显然你正试图通过全局设置为你的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'
            ]
        ]
    ];
    

    【讨论】:

    • 不工作没有差异检查 sql fiddle 链接是 sqlfiddle.com/#!9/fdaacf full sql dump pastebin.com/NtpMuCpE
    • 其实我看了你的数据库结构后觉得这个问题和SQL无关。您是否删除了全局 $criteria->together = true; ?您所说的没有区别是什么意思,现在是聚合结果还是搜索不起作用?请详细说明更改代码后发生的情况。
    • 您好,请访问更改时输出的链接imagebin.ca/v/5JIYEeb0Um3l
    • 检查这个是否一起删除条件这是必需的输出但不能搜索pasteboard.co/J42GnsT.png
    • $criteria->group = 't.id';尝试添加此行。它将按 CoreMeeting 标识符主键进行分组,这将防止从 HAS_MANY 关系聚合并保证主模型的唯一性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多