获取双层深度关系

时间:2013-08-12 10:06:14

标签: php yii

我有模型:table,column,index,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的一个查询中的所有查询。

1 个答案:

答案 0 :(得分: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/