Касаясь модели Eloquent через полиморфные отношения - PullRequest
0 голосов
/ 25 октября 2018

Ларавел 5.7.У меня есть две модели, Foo и Content.Их отношения полиморфны, поскольку Content также может относиться к другим моделям:

class Foo extends Model
{
    public function contents()
    {
        return $this->morphToMany('App\Content');
    }
}

class Content extends Model
{
    use LastModified;

    public function foos()
    {
        return $this->morphedByMany('App\Foo');
    }
}

Я хочу touch модель Foo всякий раз, когда обновляется модель Content.Поэтому я использую черту LastModified для модели Content:

trait LastModified
{
    protected static function bootLastModified()
    {
        static::updating(function ($model) {
            static::updateLastModified($model);
        });
    }

    protected static function updateLastModified($model)
    {
        $foos = $model->foos;
        if (count($foos) > 0) {
            foreach ($foos as $foo) {
                $foo->touch();
            }
        }
    }
}

Моя проблема в том, что $model->foos возвращает правильные Foo модели, но с неправильными id с.Вместо собственного идентификатора модели Foo каждый Foo имеет id строки сводной таблицы.Это означает, что к неправильной строке Foo дотронулись.

1 Ответ

0 голосов
/ 25 октября 2018

Laravel имеет встроенную функциональность для касания родительских временных меток .

В модели содержимого вы можете добавить свойство, сообщающее, какие отношения должны быть затронуты , когдаданная модель обновлена.

Должно работать следующее:

class Content extends Model
{
    protected $touches = ['foos'];

    public function foos()
    {
        return $this->morphedByMany('App\Foo');
    }
}

Редактировать: поскольку вы используете статическое обновленное событие, вы должны вручную вызвать $model->touchOwners() из static::updated

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...