Search code examples
phpyii2yii2-basic-appyii2-model

Yii2 - Unable to parse result of hasMany()


I got stuck on kinda very basic thing and can not move on. I have tables interpret and interpret_member like this (just important data here):

$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');

Then I have models for both tables generated by gii, so I also have method getInterpretMembers in Interpret model. First I tried to parse its output according to this manual, which gives me an error Trying to get property 'name' of non-object. So I searched here and found this thread. Following that I changed my foreach ($members as $member) to foreach ($members->InterpretMember as $member). That gave me error Getting unknown property: yii\db\ActiveQuery::InterpretMember. The last hope was this thread, but that ended on error Trying to get property 'name' of non-object. The code of last try was:

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();
}

I used this code for all attempts, it was just modified according to the mentioned threads and manual.


Solution

  • The problem is quite simple

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

    The hasMany function returns an ActiveQuery instance and not actually the data from DB, so in order to get data you need to call one() or all() function from ActiveQuery instance

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

    Congratulations, now you will have the data