ActiveRecord, насчет удобства и предсказуемости

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

ActiveRecord, насчет удобства и предсказуемости

Сообщение maleks »

Приветствую.
Думаю насчет некоторых сценариев работы с AR и над удобством текущих вариантов.
Есть у нас как в примере - Order и Customer
Задачи:
1) Изменить данные для Покупателя данного заказа.
Как сейчас делаем:

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

$order = Order::findOne(6);
$order->customer->age = 22;
$order->customer->save();
Как то не сильно интуитивно, что save нужно на каждом таком "внутреннем" объекте вызывать. Выглядит по коду то как будто изменил что то "внутри" order и соответственно order->save. Может есть нужда в чем то типа push() из laravel-а ?

2) Изменить заказу пользователя.
Сейчас делаем так (в примерах без проверок существования):

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

$order = Order::findOne(6);
$order->customer_id = Customer::findOne(['name' => 'Jack'])->id;
$order->save();
и так:

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

$order = Order::findOne(6);
Customer::findOne(['name' => 'Kate'])->link('orders', $order);
Первый вариант - сильно ручной, "не ооп"; Второй - сильно ненаглядный, плюс еще и сохраняет.
В то время когда например такой:

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

$order->customer->id = новый_id;
$order->save();
сделает совсем не то что вроде как выглядит сменой пользователя для заказа.

И отсутствует какая то интуитивная объектная форма для таких операции типа:

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

$order->customer = Customer::findOne(['name' => 'Jack'])
при которой для $order просто бы настроился customer_id на указанный(без сохранения $order).

Что думаете?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение maleks »

Хотя насчет "удобного" варианта, сделал сам так и работает:

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

class Order extends \yii\db\ActiveRecord
{
// ...
    public function setCustomer($customer)
    {
        $this->customer_id = $customer->id;
        $this->populateRelation('customer', $customer);
    }
} 
и вызов такой:

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

$order->customer = Customer::findOne(['name' => 'Jack']);
$order->save(); 
может такая фича и в __set у BaseActiveRecord сгодилась бы, чтобы самому каждый раз не определять.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение yan »

maleks писал(а): и вызов такой:

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

$order->customer = Customer::findOne(['name' => 'Jack']);
$order->save(); 
имхо вообще не в том направлении думаете, совсем не очевидный код получился - самому через полгода трудно будет вспомнить как он работает, куда красивей будет что-то типа

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

$order->changeCustomer(['name' => 'Jack'])
и оргазм перфекциониста и адепта солида :) - работающий через changeCustomer() метод changeCustomerByName()

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

$order->changeCustomerByName('Jack')
по поводу действующего для всех релейшенов save() - вещь на первый взгляд удобная, но хороший способ выстрелить в ногу, т.к. надо быть всегда уверенным, что в модели за релейшены загружены, а это не всегда очевидно
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение slavcodev »

yan писал(а):

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

$order->changeCustomer(['name' => 'Jack'])
 
и оргазм перфекциониста и адепта солида :)
[offtopic]какой же это солид, тут как минимум SRP нарушен :)[/offtopic]
Жду Yii 3!
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение maleks »

yan писал(а):имхо вообще не в том направлении думаете, совсем не очевидный код получился

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

var_dump($order->customer) // вернет объект типа Customer
// устанавливаю св-во по аналогии - присваивая ему объект типа Customer
$order->customer = Customer::findOne(['name' => 'Jack']); 
вроде как наглядно: работаю через "свойство" объекта $order, как обычно в yii.

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

$order->changeCustomer(['name' => 'Jack']) 
ну вот про наличие подобных дублирующих друг друга и однотипных по сути оберток, которые нужно самому определять для каждого класса и есть сомнения.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение yan »

slavcodev писал(а):
yan писал(а):

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

$order->changeCustomer(['name' => 'Jack'])
и оргазм перфекциониста и адепта солида :)
[offtopic]какой же это солид, тут как минимум SRP нарушен :)[/offtopic]
действительно с SRP тут промах, ради того чтобы скрыть в методе конкретику поиска пользователя придется оперировать двумя моделями, это кстати с SRP мне не совсем ясно - если есть куча методов с единственной ответственностью, то где-то они все равно дб вызваны совместно и этот метод уже не будет подходить под SRP :cry:
Последний раз редактировалось yan 2014.06.12, 14:18, всего редактировалось 2 раза.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение yan »

maleks писал(а):
yan писал(а):имхо вообще не в том направлении думаете, совсем не очевидный код получился

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

var_dump($order->customer) // вернет объект типа Customer
// устанавливаю св-во по аналогии - присваивая ему объект типа Customer
$order->customer = Customer::findOne(['name' => 'Jack']);
вроде как наглядно: работаю через "свойство" объекта $order, как обычно в yii,
про то что есть сеттер который переопределит ид не очевидно, указать это можно только коментом около каждого присвоения, тогда как все нюансы что делается в методе можно указать в его пхпдоке один раз, да и заглянуть в него легко
maleks писал(а):

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

$order->changeCustomer(['name' => 'Jack'])
ну вот про наличие подобных дублирующих друг друга и однотипных по сути оберток, которые нужно самому определять для каждого класса и есть сомнения.
если проект небольшой и особый рост не подразумевается, возможно они и будут неуместны, иначе с большой долей вероятности этот код понадобится где-то еще поэтому предпочитаю сразу делать методами
Последний раз редактировалось yan 2014.06.12, 14:21, всего редактировалось 1 раз.
codrilla
Сообщения: 173
Зарегистрирован: 2013.03.06, 12:24
Откуда: Молдова, Тирасполь

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение codrilla »

Согласен с maleks, что не хватает в yii сохранения связанных моделей. Как раз писал об этом в соседнем топике.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение maleks »

slavcodev писал(а):http://habrahabr.ru/post/226103/
тот автор я смотрю тоже на сеттере остановился, как и я.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение lynicidn »

maleks писал(а):
slavcodev писал(а):http://habrahabr.ru/post/226103/
тот автор я смотрю тоже на сеттере остановился, как и я.
:lol: ники ни о чем не говорят?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: ActiveRecord, насчет удобства и предсказуемости

Сообщение maleks »

lynicidn писал(а):
maleks писал(а):
slavcodev писал(а):http://habrahabr.ru/post/226103/
тот автор я смотрю тоже на сеттере остановился, как и я.
:lol: ники ни о чем не говорят?
твое сообщение ни о чем по теме топика не говорит ;)
Ответить