Yii2将3个不同的表链接在一起,并在其中一个字段中使用一个字段

时间:2019-02-28 10:59:27

标签: php yii2

我有一个具有字段(标识,名称)的代理表

我有一个具有字段(agent_id,aggregator_id)的agent_aggregators表

我有一个带有字段(agent_id)的交易表

Aggregators表通过agent_id连接到agent表。

交易记录表具有agent_id字段。

现在在我的交易视图中,我有一个index.php,我想显示执行特定交易的聚合器的名称

交易视图/ index.php

['class' => 'yii\grid\SerialColumn'],
[
   'attribute' => 'agent.aggregators.name',
   label' => 'Aggregator\'s  Name',
]

交易模型:

<?php

namespace app\models;

use Yii;


class Transactions extends \yii\db\ActiveRecord
{

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'transactions';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [



        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'ID' => 'ID',
        ];
    }



    public function getAgent()
    {
        return $this->hasOne(Agents::className(), ['ID' => 'agent_id']);
    }

}

聚合器模型:

<?php

namespace app\models;

use Yii;

class AgentsAggregators extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'agents_aggregators';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [

        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'agent_id' => 'Agent ID',

        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAgent()
    {
        return $this->hasOne(Agents::className(), ['ID' => 'agent_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAggregator()
    {
        return $this->hasOne(Agents::className(), ['ID' => 'aggregator_id']);
    }


}

代理商模型:

<?php

namespace app\models;

use Yii;

class Agents extends \yii\db\ActiveRecord
{

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'agents';
    }

    /**
     * @inheritdoc
     */

        public function rules()
    {
        return [

        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'ID' => 'ID',
            'name' => 'Agent\'s Name',
        ];
    }


    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAgentsAggregators()
    {
        return $this->hasMany(AgentsAggregators::className(), ['agent_id' => 'ID']);
    }


    public function getAggregators()
    {
        return $this->hasMany(Agents::className(), ['ID' => 'aggregator_id'])->viaTable('agents_aggregators', ['agent_id' => 'ID']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAgents()
    {
        return $this->hasMany(Agents::className(), ['ID' => 'agent_id'])->viaTable('agents_aggregators', ['aggregator_id' => 'ID']);
    }

}

1 个答案:

答案 0 :(得分:0)

您在事务和代理表之间的关系是一对多关系。但是,聚集者的代理是很多很多的。因此,您不能获得一个聚合器(严格意义上来说),但是它将始终是聚合器的集合(尽管可能只有一个元素)。这段代码应该说明您正在尝试做的事情。

如果我误解了您的问题,请在评论中让我知道。

[
   'label' => "Aggregator's  Name",
   'format' =>'ntext',
    'value' => function($model)
    {
        $aggrs = $model->agent->aggregators;
        return implode('\n', $aggrs);
    }
]