0

我有模型:表、列、索引、index_column。关系:

表 1..* 列

表 1..* 索引

索引 1..* index_column

模型表中定义的关系:

        'columns' => array(self::HAS_MANY, 'AdColumn', 'table_id'),
        'indexes' => array(self::HAS_MANY, 'AdIndex', 'table_id'),

模型列中定义的关系:

        'table' => array(self::BELONGS_TO, 'AdTable', 'table_id'),

模型索引中定义的关系:

        'columns' => array(self:: HAS_MANY, 'AdIndexColumn', 'index_id'),
        'table' => array(self:: BELONGS_TO, 'AdTable', 'table_id'),

模型 index_column 中定义的关系:

        'column' => array(self::BELONGS_TO, 'AdColumn', 'column_id'),
        'index' => array(self::BELONGS_TO, 'AdIndex', 'index_id'),
        'table' => array(self::BELONGS_TO, 'AdTable', 'table_id'),

我需要显示(使用 CGridView)表列表,在每一行中应该有表列列表和索引列表(名称 + 列)。

模型是用 Gii 生成的,所以我尝试了:

    $filter = new AdTable('search');
    $filter->unsetAttributes();  // clear any default values
    $dataProvider = $filter->with('columns', 'indexes')->search();

这产生了查询:

  • 用于获取所有表,
  • 用于获取上述表格的所有列
  • 用于获取上述表的所有索引

但是对于每个索引,还有另一个用于获取索引列的查询。我喜欢 Yii 将这些查询放在一个查询中。

4

1 回答 1

0

低于你想要的吗?

$filteredAdTable = AdTable::model()->with(array(
            'indexes' => array(
                'alias' => 'at',
                //'condition' => '',
                //'params' => array(),
                'with' => array(
                    'adIndexColumns'=>array( // 'I changed name this relation from columns to adIndexColumns not to make confusion with the relation columns of AdTable'
                        'alias' => 'aic',
                        //'condition' => '',
                        //'params' => array(),
                    )

                )
            ),

            'columns' => array(
                'alias' => 'ac',
                //'condition' => '',
                //'params' => array(),
            )
        ))->findAll(
            //'condition' => '',
            //'params' => array(),
            );

也许你应该看看together选项

http://www.yiiframework.com/wiki/527/relational-query-lazy-loading-and-eager-loading-with-and-together/

于 2013-08-13T05:00:01.557 回答