Красноречивый пункт о принадлежности к отношениям - PullRequest
0 голосов
/ 21 сентября 2018

Допустим, я уже загрузил отношение, и теперь я хочу получить модели, которые его удовлетворяют.
Есть ли способ сделать это объективным образом, вместо непосредственного использования идентификаторов?
Вот примерКонтроллер, описывающий то, чего я хочу достичь:

public function videos(User $user, Category $category)
{
    $videos = Video::where('user', $user)->where('category', $category)->get();
    // ...
}

Я знаю, что могу сделать это следующим образом, но я хотел бы пропустить извлечение идентификатора и оставить его для фреймворка, если это возможно:

public function videos(User $user, Category $category)
{
    $videos = Video::where('user_id', $user->id)->where('category_id', $category->id)->get();
    // ...
}

Ответы [ 2 ]

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

Это не идеально, но я нашел способ сделать это легко с помощью областей.
Вот мой код:

trait WhereBelongsTo
{
    /**
     * @param \Illuminate\Database\Eloquent\Builder|self $query
     * @return \Illuminate\Database\Eloquent\Builder|self
     */
    public function scopeWhereBelongsTo($query, $relationship, $value)
    {
        /** @var \Illuminate\Database\Eloquent\Relations\BelongsTo $relationship */
        $relationship = call_user_func([$this, $relationship]);

        $foreignKey = $relationship->getForeignKey();
        $ownerKey = $relationship->getOwnerKey();

        if($value === null) {
            return $query->whereNull($foreignKey);
        } else {
            return $query->where($foreignKey, $value->$ownerKey);
        }
    }
}

После добавления этой черты в модель, я могу использовать ее следующим образом:

public function videos(User $user, Category $category)
{
    $videos = Video::whereBelongsTo('user', $user)->whereBelongsTo('category', $category)->get();
    // ...
}
0 голосов
/ 21 сентября 2018

То есть у вас есть видео, которое принадлежит пользователю, правильно?Вы можете сделать что-то вроде этого:

В вашей пользовательской модели:

public function videos()
{
    return $this->hasMany(Video::class);
}

И затем вы можете назвать эту функцию как

$user->videos();

или

$this->user->videos->toArray();

Если вы начнете создавать подобные отношения в модели, это может значительно упростить получение данных.Может быть не полный ответ, но определенно на правильном пути.Удачи!

Красноречивые отношения: https://laravel.com/docs/5.7/eloquent-relationships

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