Как правильнее писать hasOne/hasMany?

280
03 ноября 2017, 11:44

Я пишу так:

/**
 * @return array|null|User
 */
public function getUser() {
    return $this->hasOne(User::className(), ['id' => 'user_id'])->one();
}

А в примерах везде возвращают без ->one только запрос. Аналогично и с hasMany (только там ->all()). Как правильнее? Просто когда возвращаешь объект, а не запрос - можно за счет phpdoc подставить тайпхинты в IDE. Это очень удобно. Но с другой стороны порой приходится дублировать код когда в другом месте надо ту же связь, но с изменением запроса (например условие добавить). Правда редко.

Answer 1

Писать можно и так и так. В классе BaseActiveRecord переопределен __get, когда вы обращаетесь к $model->user обрабатывается такой кусок кода:

...
        $value = parent::__get($name);
        if ($value instanceof ActiveQueryInterface) {
            return $this->_related[$name] = $value->findFor($name, $this);
        } else {
            return $value;
        }
...

Из него видно что если вы в релейшене вернули запрос она его выполнит findFor, а если уже готовый результат, то просто вернет его. Определеяется это по наличию интерфейса.

Как писать с точки зрения веры вам решать.

READ ALSO
Отправка email-уведомлений с записью в cache-файл. PHP

Отправка email-уведомлений с записью в cache-файл. PHP

Есть функция отправки email-уведомлений на почту администратораФункция рабочая (уведомление приходит), но она срабатывает каждый раз когда...

221
Робокасса, result.php, отправка e-mail

Робокасса, result.php, отправка e-mail

Для моего сайта я настроил все, кроме resultphp, на который отправляется запрос после успешной оплаты

247
Получить доступ к константам Joomla

Получить доступ к константам Joomla

Есть скрипт в папке с Joomla, точнее /var/www/html/joomla/images/filephp

227