【问题标题】:Yii AR join not working when using findAllYii AR join 在使用 findAll 时不起作用
【发布时间】:2012-05-22 06:45:52
【问题描述】:

我有两张桌子menuslang_menus。我的Menus 模型如下:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
                'menulanguages'=>array(self::HAS_MANY, 'MenuLangs', 'menuId'),
    );
}
...
public function getMenus(){
        $criteria = new CDbCriteria();
        $criteria->condition = "t.clientId = ".Yii::app()->user->clientId." AND menulanguages.languageId = ".Yii::app()->user->userlanguage;


        $count = Menus::model()->with('menulanguages')->count($criteria);

        $pages=new CPagination($count);
        //Results per page
        $pages->pageSize=10;
        $pages->applyLimit($criteria);

        $menus = Menus::model()->with('menulanguages')->findAll($criteria);
        return array('menus' => $menus, 'paging' => $pages);
    }

这是抛出错误Unknown column 'menulanguages.languageId'。 错误在$menus = Menus::model()->with('menulanguages')->findAll($criteria); 行中。

令人惊讶的是,我正确地获取了变量 $count 的值。

在查看日志时,我可以看到为 findAll 查询运行的 SQL 查询是:

SELECT `t`.`id` AS `t0_c0`, `t`.`clientId` AS `t0_c1`, `t`.`restaurantId` AS `t0_c2` FROM `posif_menus` `t` WHERE (t.clientId = 1 AND menulanguages.languageId = 2) LIMIT 10

这意味着连接没有发生。而正确的连接查询正在为计数值运行。难道我做错了什么 ? 请帮忙。

【问题讨论】:

    标签: php yii


    【解决方案1】:

    只需使用together() of CActiveRecordtogether property of CDbCriteria

    $menus = Menus::model()->with('menulanguages')->together()->findAll($criteria);
    

    或:

    $criteria = new CDbCriteria();
    $criteria->condition = "t.clientId = ".Yii::app()->user->clientId." AND menulanguages.languageId = ".Yii::app()->user->userlanguage;
    $criteria->together=true;
    

    【讨论】:

    • 很抱歉打扰您@bool.dev,但是我如何才能显示从第二个表中获得的数据?我试过echo $menu->nameecho $menu->menulanguages->name 但它不起作用。但是我可以在对结果对象执行 var_dump 时看到 name 的值(这是第二个表中的一个字段)。
    • $menu 是一个菜单对象数组,每个对象都有相关的 menulanguages 对象,所以你必须这样做echo $result['menus'][0]->menulanguages[0]->name;
    • 完美 .. 你太棒了 ;)
    【解决方案2】:

    试试这个..在 cdbcriteria 中应用连接表..

    public function getMenus(){
            $criteria = new CDbCriteria();
            $criteria->condition = "t.clientId = ".Yii::app()->user->clientId." AND                                               menulanguages.languageId = ".Yii::app()->user->userlanguage;
            $criteria->with = array('menulanguages');
    
            $count = Menus::model()->count($criteria);
    
            $pages=new CPagination($count);
            //Results per page
            $pages->pageSize=10;
            $pages->applyLimit($criteria);
    
            $menus = Menus::model()->findAll($criteria);
            return array('menus' => $menus, 'paging' => $pages);
        }
    

    【讨论】:

    • 它不工作。显示相同的 SQL 错误。查询还是一样的。也应该是$criteria->with = 'menulanguages'
    • 试试这个.. $criteria->with = array('menulanguages');
    • 我让它与 bool.dev 的解决方案一起工作。但仍然无法弄清楚如何在视图中打印连接表字段的值。我试过echo $menu->nameecho $menu->menulanguages->name 但它不起作用。但是我可以在对结果对象执行 var_dump 时看到 name 的值(这是第二个表中的一个字段)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多