0

フォルダーとフォルダー内のアイテムの良いケースがあります。すべての 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

ご想像のとおり、1 つのアイテムが複数のフォルダー (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ます。

問題は、それを正しく明確にする方法です。

4

1 に答える 1

1

試す

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

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

「結合されている2つ以上のテーブルに列名が表示される場合、あいまいさを解消する必要があります。これは、テーブルのエイリアス名を列名の前に付けることによって行われます。

リレーショナル AR クエリでは、プライマリ テーブルのエイリアス名は t に固定されていますが、リレーショナル テーブルのエイリアス名はデフォルトで対応するリレーション名と同じです。

于 2012-11-07T11:23:50.537 に答える