雄辩的belongsTo关系的where子句

时间:2018-09-21 11:46:48

标签: php laravel eloquent

让我们说我已经加载了该关系,现在我想获取实现该关系的模型。
有没有一种方法可以客观地做到这一点,而不是直接使用ID?
这是一个示例控制器,描述了我想要实现的目标:

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

我知道我可以这样做,但是我想跳过提取id并尽可能将其留给框架:

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

2 个答案:

答案 0 :(得分:0)

那么您将拥有一个属于用户的视频,对吗?您可以这样做:

在您的用户模型中:

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

然后您可以将其命名为

$user->videos();

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

如果您开始在模型中创建这样的关系,它将使数据检索变得非常容易。可能不是完整的答案,但绝对正确。祝你好运!

口交:https://laravel.com/docs/5.7/eloquent-relationships

答案 1 :(得分:0)

它并不完美,但是我找到了一种使用示波器轻松实现的方法。
这是我的代码:

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();
    // ...
}