Как правильно сохранять отношения в Yii2?

есть обычная зависимость между таблицами comment, post, user
вот так добавляется новый комментарий , на бэкэнде
protected function newComment($post) {
        $model = new Comment();
        if ( $model->load( Yii::$app->request->post() ) ) {
            $model->user_id = \Yii::$app->user->identity->id;
            $model->post_id = $post->id;
            $model->date = date('Y-m-d H:i:s');
            $model->save();
        }
        return $model;
    }

чувствую я что можно это сделать более красивее, раз связи прописаны. что то типа
$comment->setPost($post);
$comment->setUser($user);

как можно обойти все эти прямые обращения к полям ($model->user_id, $model->post_id) ?
  • Вопрос задан
  • 926 просмотров
Пригласить эксперта
Ответы на вопрос 1
copist
@copist
Empower people to give
Прямых методов нет, то ты можешь реализовать их таким образом самостоятельно

class Comment extends CActiveRecord
{
    public function setUser(\User $user = null)
    {
        if (is_null($user))
        {
            $this->user_id = null;
        } else
        {
            $this->user_id = $user->id;
        }
    }
}

$comment = new Comment;
$comment->user = $user;
// или
$comment->setUser($user);


На самом деле схема значительно более сложная, чем просто написать setter для свойства user.
Что делать, если поменять свойство user_id через которое вычисляется user - его же вроде опять надо подгрузить из базы?
Будут ли идентичными сущности $user для двух разных комментариев с одинаковым user_id?
Что делать, если $user ещё не был сохранён ? Не давать присваивать $comment->setUser($user) или делать автоматическое сохранение цепочкой (сначала $user, затем $comment) ?

Много много много вопросов.
В Yii2 такие сложности не реализованы, поскольку универсальное всеохватывающее решение как в Doctrina или PropelORM работают очень медленно и жрут память. Там как раз иногда приходится запрещать навороченную логику.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 00:16
2000 руб./за проект
22 нояб. 2024, в 23:55
3000 руб./за проект
22 нояб. 2024, в 22:26
3500 руб./за проект