Yii2 ArrayHelper :: map left join select

У меня есть пользователи, заказы и планы. Когда клиент покупает план, данные сохраняются в 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,
                        ],
                    ]);
                    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
789
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это связано с тем, что ваш запрос возвращает список моделей 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

Sudharshan Nair 20.07.2018 14:23

он использует псевдоним account_planLang.name as name для поля. @SudharshanNair

Muhammad Omer Aslam 20.07.2018 18:58
Ответ принят как подходящий

Думаю, в использовании 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();

Другие вопросы по теме