如何消除yii MANY_MANY关系中列名的歧义

时间:2012-11-07 11:10:20

标签: activerecord yii disambiguation

我在文件夹中有一个很好的文件夹和项目案例。所有mysql都是为了清晰起见而缩写。

CREATE TABLE folder
  folder_id INT,
  name VARCHAR(32),
  sort_weight INT

CREATE TABLE item
   item_id INT,
   name VARCHAR(32)

当然还有链接表

 CREATE TABLE item_folder
   folder_id INT,
   item_id INT,
   sort_weight INT

你可能已经猜到一个项目可以在多个文件夹中(有点像linux文件系统中的硬链接)并注意到该文件夹​​也有sort_weight,因为它可以在另一个文件夹中排序。现在我正在使用Yii,我在Item模型中有一个很好的关系:

public function relations()
{
    return array(
        'folderitems' => array(self::MANY_MANY, 'Folder', 'item_folder(item_id, folder_id)'),
    );
}

问题在于,当我尝试制作一些不错的AR请求并尝试对其进行排序时,我遇到了问题。我的AR请求:

$items = Item::model()->with(array(
  'folderitems' => array(
     'condition' => "folderitems.folder_id = $someid"
   ),
))->findAll(array('order'=> "folderitems.sort_weight"));

现在的问题是,使用这样的语法,而不是按item_folder.sort_weight排序,它按folder.sort_weight进行排序。

如果我将字段名称更改为item_folder.sort_weight2并尝试:

[...] ))->findAll(array('order'=> 'sort_weight2'));

它有效。

但是如果我保持两个名字相同并尝试

[...] ))->findAll(array('order'=> 'item_folder.sort_weight'));

它说unknown column

所以问题是 - 如何正确消除歧义。

1 个答案:

答案 0 :(得分:1)

尝试

[...] ))->findAll(array('order'=> 't.sort_weight'));

http://www.yiiframework.com/doc/guide/1.1/en/database.arr#disambiguating-column-names

“当一个列名出现在连接在一起的两个或多个表中时,需要消除歧义。这可以通过在列名前加上其表的别名来实现。

在关系AR查询中,主表的别名固定为t,而关系表的别名默认与对应的关系名相同。“