让我们说我已经加载了该关系,现在我想获取实现该关系的模型。
有没有一种方法可以客观地做到这一点,而不是直接使用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();
// ...
}
答案 0 :(得分:0)
那么您将拥有一个属于用户的视频,对吗?您可以这样做:
在您的用户模型中:
public function videos()
{
return $this->hasMany(Video::class);
}
然后您可以将其命名为
$user->videos();
或
$this->user->videos->toArray();
如果您开始在模型中创建这样的关系,它将使数据检索变得非常容易。可能不是完整的答案,但绝对正确。祝你好运!
答案 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();
// ...
}