我在我的联系人模型中使用以下功能
public static function getParents()
{
return $this->hasMany(Contact::className(), ['parent_id' => 'id']);
}
我想在我的视图的过滤器属性中返回这个数组:
[
'attribute' => 'parent_id',
'value' => function ($model) {
return $model->parent ? $model->parent->name : null;
},
'hAlign' => 'left',
'vAlign' => 'middle',
//'filter' => ArrayHelper::map(Contact::find()->where(['<>', 'parent_id', 0])->orderBy('name')->asArray()->all(), 'id', 'name'),
'filter' => ArrayHelper::map(Contact::parents()->asArray()->all(), 'id', 'name'),
'filterWidgetOptions' => [
'pluginOptions' => ['allowClear' => true],
],
'filterInputOptions' => ['placeholder' => 'Parent'],
'format' => 'raw'
],
但我收到以下错误:调用未定义的方法 common\models\Contact::parents()
其余的关系工作正常,例如属性 $model->parent
我正在使用以下代码,但它是错误的,因为不会将 parent_id 的名称带到同一个表中,而是将带有 parent_id 的记录的名称
'filter' => ArrayHelper::map(Contact::find()->where(['<>', 'parent_id', 0])->orderBy('name')->asArray()->all(), 'id', 'name'),
我设法使用表单中的 2 个查询来修复我的过滤器,但不是很优雅:
$subQuery = Contact::find()->select('parent_id')->where(['<>', 'parent_id', 0]);
$parents = ArrayHelper::map(Contact::find()->where(['in', 'id', $subQuery])->orderBy('name')->asArray()->all(), 'id', 'name')
正确答案后更新
我将逻辑放在模块中以在其他地方重用它并使用 getParentsArray 而不仅仅是 parentsArray
public static function getParentsArray() {
$subQuery = Contact::find()->select('parent_id')->where(['<>', 'parent_id', 0]);
$parents = ArrayHelper::map(Contact::find()->where(['in', 'id', $subQuery])->orderBy('name')->asArray()->all(), 'id', 'name');
return $parents;
}
在视图或控制器中
$parents = Contact::getParentsArray();