Yii2 - 无法解析hasMany()的结果。

问题描述 投票:0回答:1

我被一些很基本的东西卡住了,无法继续前进。我有表格 interpretinterpret_member 这样(这里只是重要数据)。

$this->createTable('interpret', [
    'name'      => $this->string(255)->notNull(),
    'PRIMARY KEY (name)'
]);

$this->createTable('interpret_member', [
    'name'      => $this->string(255)->notNull(),
    'interpret' => $this->string(255)->notNull(),
    'PRIMARY KEY (name, interpret)'
]);

$this->createIndex(
    'idx-interpret_member',
    'interpret_member',
    'interpret'
);

$this->addForeignKey('fk-interpret_member', 'interpret_member', 'interpret', 'interpret', 'name', 'CASCADE', 'CASCADE');

然后我有两个表的模型都是由gii生成的,所以我也有了方法 getInterpretMembersInterpret model. 首先,我试着根据它的输出来解析 这个 手册,这给我一个错误 Trying to get property 'name' of non-object. 所以我在这里搜索了一下,发现 这个 线路。之后,我改变了我的 foreach ($members as $member)foreach ($members->InterpretMember as $member). 这给我的错误 Getting unknown property: yii\db\ActiveQuery::InterpretMember. 最后的希望是 这个 线程,但最后还是出错 Trying to get property 'name' of non-object. 最后一次尝试的代码是。

public function getInterpretMembers()
{
    $members = $this->hasMany(InterpretMember::className(), ['interpret' => 'name']);
    foreach ($members as $member) {
        $member = ArrayHelper::toArray($member, [
            'app\models\user\InterpretMember' => [
                'name',
                'interpret',
                'position'
            ]
        ]);
        echo "Member = {$member->name}<br/>";
    }
    die();
}

我在所有的尝试中都使用了这个代码,只是根据提到的线程和手册进行了修改。

php yii2 yii2-basic-app yii2-model
1个回答
1
投票

问题很简单

$members = $this->hasMany(InterpretMember::className(), ['interpret' => 'name']); 

有很多 函数返回一个 ActiveQuery 实例,而不是实际从DB中获取数据,所以为了获取数据,你需要调用 一()全部() 功能从 ActiveQuery 实例

$members = $this->hasMany(InterpretMember::className(), ['interpret' => 'name'])->all();

恭喜你,现在你将拥有数据


1
投票

你误解了关系和 ActiveRecord 在Yii2中工作。

你的模型应该是什么样子的。

解释模型

class Interpret extends \yii\db\ActiveRecord
{
    /**
    * Method that defines the relation. It should
    * return instance of \yii\db\ActiveQuery
    */
    public function getInterpretMembers()
    {
        return $this->hasMany(InterpretMember::class, ['interpret' => 'name']);
    }

    //... other methods
}

解释成员模型

class InterpretMember extends \yii\db\ActiveRecord
{
    public function getInterpret()
    {
        return $this->hasOne(Interpret::class, ['name' => 'interpret'])
    }
}

这将会创造财产 interpretMembers 在你 Interpret 阶级属性 interpret 在你 InterpretMember 类。

要在你的控制器中使用它,你可以做如下工作。

class InterpretController extends \yii\web\Controller
{
    public function actionView()
    {
        //find interpret with name InterpretName
        $interpret = Interpret::findOne('InterpretName');
        //output all members
        foreach ($interpret->interpretMembers as $member) {
            echo "Member = {$member->name}<br/>";
        }
        die();
    }
}

或者如果你想在Interpret类中使用成员,

class Interpret extends \yii\db\ActiveRecord
{
    /**
    * Method that defines the relation. It should
    * return instance of \yii\db\ActiveQuery
    */
    public function getInterpretMembers()
    {
        return $this->hasMany(InterpretMember::class, ['interpret' => 'name']);
    }

    //... other methods

    public function doSomethingWithMembers()
    {
        foreach ($this->interpretMembers as $member) {
            echo "Member = {$member->name}<br/>";
        }
        die();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.