laravel 仅为“auth”用户加载特定关系

Posted

技术标签:

【中文标题】laravel 仅为“auth”用户加载特定关系【英文标题】:laravel load specific relation only for "auth" users 【发布时间】:2021-09-07 01:09:13 【问题描述】:

当用户通过身份验证时,是否有机会让 laravel 只加载特定项目?

假设这段代码:

public function getCategory(Category $category)

    $items = $category->products()->with(['otherRelation', 'favouriteUsers' => function($query)
            $query->where('user_id', Auth::id())->select(['product_id', 'user_id']);
        ])->withCount([
            'views',
    ])->latest()->paginate(20);

此时将加载favouriteUsers 关系,无论用户是否经过身份验证,有什么方法可以阻止 laravel 执行此查询,除非用户经过身份验证?

【问题讨论】:

尝试 $items = $category->products()->with(['otherRelation'])->when(Auth::id(),function($query) $query-> whereHas('favouriteUsers' , function($query) $query->where('user_id', Auth::id())->select(['product_id', 'user_id']); ); ) - >withCount([ 'views', ])->latest()->paginate(20); 我认为不是whereHas 而是with,不是吗? 如果你需要数据那么你可以使用 with 否则 wherehas.wherehas 不会返回 favouriteUsers 的结果。所以如果你正在寻找数据然后使用 with 如果您有任何问题,请告诉我 【参考方案1】:

您需要在User::class 中有关系favoriteProducts()

这样会更容易获得

$user = Auth::user();
$favoriteProducts = $user->favoriteProducts()
    ->with('otherRelation')
    ->withCount('views')
    ->whereHas('category', function($categoryQB) use($category) 
        $categoryQB->where('id', $category->id);
    )
    ->latest()->paginate(20);

【讨论】:

这里不可能,因为检索到的产品应该都是相关类别的。 favouriteUsers 关系仅应在经过身份验证时加载,它在模板中用于检查用户是否可以收藏该产品。

以上是关于laravel 仅为“auth”用户加载特定关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Auth::user() 关系

从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误

Laravel Auth::attempt() 可以处理关系吗?

Laravel 5.3 Auth 阻止用户

检查具有特定id的用户是否已登录laravel 5.2

Laravel:注销特定用户