【发布时间】:2023-03-20 06:40:01
【问题描述】:
我在我的联系人模型中使用以下函数
public static function getParents()
{
return $this->hasMany(Contact::className(), ['parent_id' => 'id']);
}
我想在我的视图的filter属性中得到这个数组的返回:
[
'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();
【问题讨论】:
标签: yii yii2 yii2-advanced-app yii2-model kartik-v