Active record, with

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Марат
Сообщения: 10
Зарегистрирован: 2022.05.04, 17:48

Active record, with

Сообщение Марат »

Модель Customer:

Код: Выделить всё

namespace app\models;

use yii\db\ActiveRecord;

class Customer extends ActiveRecord
{
    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;
    
    /**
     * @return string the name of the table associated with this ActiveRecord class.
     */
    public static function tableName()
    {
        return '{{customer}}';
    }
    
    public function getOrders()
    {
        return $this->hasMany(Order::class, ['customer_id' => 'id']);
    }
    
    public static function getStatuses()
    {
        return [
            self::STATUS_INACTIVE => 'Inactive',
            self::STATUS_ACTIVE => 'Active',
        ];
    }
    
    public function getStatus()
    {
        return self::getStatuses()[$this->status];
    }
}
Контроллер:

Код: Выделить всё

$customers = Customer::find()->with('orders')->all();
Хочется сделать для всех записей, чтобы вытащил значение статуса во вложенном массива, также как вытащил orders, по типу:

Код: Выделить всё

$customers = Customer::find()->with('orders', 'status')->all();
но так не работает. Помогите пожалуйста
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Active record, with

Сообщение Dominus »

Код: Выделить всё

public function getStatus()
{
    return ArrayHelper::getValue(self::getStatuses(), $this->status);
}

Код: Выделить всё

$customers = Customer::find()->with(['orders'])->all();

Код: Выделить всё

$result = [];
foreach($customers as $customer) {
    $result[$customer->id]['status'] = $customer->getStatus();
    $result[$customer->id]['orders'] = $customer->orders;
}
Не совсем понятно что вы хотите сделать, в with используется название связи и там возвращается ActiveQuery. Статус же у вас имеет родительская сущность, и метод getStatus() возвращает строку.

Если в противоположную сторону из дочерней модели вытянуть статус родительской, то использовать в дочерней Order, связь hasOne

Код: Выделить всё

public function getCustomer()
{
    return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}

Код: Выделить всё

$orders = Order::find()->with(['customer'])->all();

$result = [];
foreach($orders as $order) {
    $result[$order->id]['status'] = $order->customer->getStatus();
    $result[$order->id]['customer'] = $order->customer;
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Марат
Сообщения: 10
Зарегистрирован: 2022.05.04, 17:48

Re: Active record, with

Сообщение Марат »

Dominus писал(а): 2022.09.08, 13:43

Код: Выделить всё

public function getStatus()
{
    return ArrayHelper::getValue(self::getStatuses(), $this->status);
}

Код: Выделить всё

$customers = Customer::find()->with(['orders'])->all();

Код: Выделить всё

$result = [];
foreach($customers as $customer) {
    $result[$customer->id]['status'] = $customer->getStatus();
    $result[$customer->id]['orders'] = $customer->orders;
}
Не совсем понятно что вы хотите сделать, в with используется название связи и там возвращается ActiveQuery. Статус же у вас имеет родительская сущность, и метод getStatus() возвращает строку.

Если в противоположную сторону из дочерней модели вытянуть статус родительской, то использовать в дочерней Order, связь hasOne

Код: Выделить всё

public function getCustomer()
{
    return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}

Код: Выделить всё

$orders = Order::find()->with(['customer'])->all();

$result = [];
foreach($orders as $order) {
    $result[$order->id]['status'] = $order->customer->getStatus();
    $result[$order->id]['customer'] = $order->customer;
}
Хорошо, а другими средствами, без цикла не получится сделать? Просто записей может быть много и не хотелось бы в цикле крутить.
Марат
Сообщения: 10
Зарегистрирован: 2022.05.04, 17:48

Re: Active record, with

Сообщение Марат »

Dominus писал(а): 2022.09.08, 13:43

Код: Выделить всё

public function getStatus()
{
    return ArrayHelper::getValue(self::getStatuses(), $this->status);
}
А за этот кусок, спасибо, заменю свой)
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Active record, with

Сообщение Dominus »

Марат писал(а): 2022.09.08, 14:25 Хорошо, а другими средствами, без цикла не получится сделать? Просто записей может быть много и не хотелось бы в цикле крутить.
Циклы тут только для наглядности, в том же GridView, вывод статуса из родительской сущности выводится так, с условием что описана связь hasOne в Order

Код: Выделить всё

'columns' => [
    //...
    [
    	'label' => 'Статус Customer',
    	'format' => 'raw',
    	'value' => function (Order $model) {
             return $model->customer->getStatus();
        }
    ]
    //...
]
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Марат
Сообщения: 10
Зарегистрирован: 2022.05.04, 17:48

Re: Active record, with

Сообщение Марат »

Dominus писал(а): 2022.09.08, 14:44
Марат писал(а): 2022.09.08, 14:25 Хорошо, а другими средствами, без цикла не получится сделать? Просто записей может быть много и не хотелось бы в цикле крутить.
Циклы тут только для наглядности, в том же GridView, вывод статуса из родительской сущности выводится так, с условием что описана связь hasOne в Order

Код: Выделить всё

'columns' => [
    //...
    [
    	'label' => 'Статус Customer',
    	'format' => 'raw',
    	'value' => function (Order $model) {
             return $model->customer->getStatus();
        }
    ]
    //...
]
Хорошо, спасибо большое.
Ответить