我被一些很基本的东西卡住了,无法继续前进。我有表格 interpret
和 interpret_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生成的,所以我也有了方法 getInterpretMembers
在 Interpret 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();
}
我在所有的尝试中都使用了这个代码,只是根据提到的线程和手册进行了修改。
问题很简单
$members = $this->hasMany(InterpretMember::className(), ['interpret' => 'name']);
该 有很多 函数返回一个 ActiveQuery 实例,而不是实际从DB中获取数据,所以为了获取数据,你需要调用 一() 或 全部() 功能从 ActiveQuery 实例
$members = $this->hasMany(InterpretMember::className(), ['interpret' => 'name'])->all();
恭喜你,现在你将拥有数据
你误解了关系和 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();
}
}