У меня есть пользователи, заказы и планы. Когда клиент покупает план, данные сохраняются в orders, планы - в account_plan, а информация для пользователя - в таблице users. В таблице orders указано, когда план начинается и когда он истекает. Я использую для Select2 ArrayHelper, но не показываю столбец
вот запрос
$masAcc[0] = Yii::t('app', 'Choose plan');
$masAcc['----------------'] =
ArrayHelper::map(
\backend\models\Orders::find()
->select('orders.*,account_planLang.name as name')
->leftJoin('orders_props','`orders_props`.`order_id`= `orders`.`id`')
->leftJoin('account_plan','`orders_props`.`product_id`=`account_plan`.`id`')
->leftJoin('account_planLang','account_plan.id=account_planLang.plan_id')
->where('`orders`.`dt_end`<CURDATE() + INTERVAL 5 DAY AND `orders`.`dt_end`<CURDATE()')
->all(), 'id', 'name');
но ошибка:
Getting unknown property: backend\models\Orders::name
вот Select2:
$form->field($model, 'account')->widget(Select2::classname(), [
'model' => $model,
'theme' => 'bootstrap',
'options' => [
'placeholder' => Yii::t('app', 'app.choose'),
'class' => 'form-control select2'
],
'data' => $masAcc,
'pluginOptions' => [
'allowClear' => true,
],
]);
}






Это связано с тем, что ваш запрос возвращает список моделей Orders, в котором нет столбца name, поэтому он не может представлять результат этого запроса. Вам нужно использовать asArray(), когда вы хотите запросить поле, которое недоступно в модели:
ArrayHelper::map(
\backend\models\Orders::find()
->select('orders.*,account_planLang.name as name')
->leftJoin('orders_props','`orders_props`.`order_id`= `orders`.`id`')
->leftJoin('account_plan','`orders_props`.`product_id`=`account_plan`.`id`')
->leftJoin('account_planLang','account_plan.id=account_planLang.plan_id')
->where('`orders`.`dt_end`<CURDATE() + INTERVAL 5 DAY AND `orders`.`dt_end`<CURDATE()')
->asArray() // <- this
->all(),
'id',
'name'
);
Или добавьте в свою модель поле name:
class Orders extends ActiveRecord {
public $name;
// ...
}
он использует псевдоним account_planLang.name as name для поля. @SudharshanNair
Думаю, в использовании ArrayHepler :: map () нет необходимости. Попробуйте так:
Orders::find()
->select('account_planLang.name as name, table_name.id as id')
->leftJoin('orders_props','`orders_props`.`order_id`= `orders`.`id`')
->leftJoin('account_plan','`orders_props`.`product_id`=`account_plan`.`id`')
->leftJoin('account_planLang','account_plan.id=account_planLang.plan_id')
->where('`orders`.`dt_end`<CURDATE() + INTERVAL 5 DAY AND `orders`.`dt_end`<CURDATE()')
->indexBy('id')
->column();
Я думаю, пользователю нужно получить
account_planLang.name