【问题标题】:Laravel 5.7 select only relationship data without loop through other relationshipLaravel 5.7只选择关系数据而不循环其他关系
【发布时间】:2019-06-19 00:05:54
【问题描述】:

我有 3 张桌子 1) 产品 2) 评论 3) 用户

一个产品可以有多个 cmets,一个评论只属于一个用户。 这是我为所有 3 个模型定义的关系。

1) 产品模型

class product{
     public function comments(){
           return $this->hasMany(Comments::class,'product_id');
     }
}

2) 评论模型

class comments{

     public function product(){
           return $this->belongsTo(Product::class);
     }

     public function user(){
           return $this->hasOne(User::class,'id','user_id');
     }
}

3) 用户模型

class User{
     public function comment(){
           return $this->belongsTo(Comments::class);
     }
}

我想获取所有评论过产品的用户。 (我知道我可以使用 with() 并遍历产品和评论,但我不想遍历所有 cmets,我希望所有用户都得到一个没有评论数据的答案。)


简而言之,我想要所有评论过该产品的用户数据 产品(不循环所有评论)


【问题讨论】:

  • @Iftikharuddin 是的,它也不起作用

标签: laravel laravel-5 eloquent laravel-5.7


【解决方案1】:

您不能“绕过comments 关系”,因为productuser 之间没有直接关系,但是您可以获取cmets 及其用户,然后pluck 所有用户。

$users = Product::with('comments', 'comments.user')
                ->find(2) // product_id
                ->comments
                ->pluck('user')
                ->unique();

您将获得独特的User 模型集合。

别忘了->find()可以返回null,所以你应该添加相应的检查,以避免访问->comments->comments得到异常。

【讨论】:

    【解决方案2】:

    试试这个:

    User::whereHas('comment', function ($query) use ($productId) {
            $query->whereHas('product', function ($query) use ($productId) {
                $query->where('products.id', $productId);
            });
        })->get();
    

    【讨论】:

    • OP 希望来自 productId 而不是直接来自 User 模型
    • @jinal 我只想从产品对象中获取用户数据。阅读整个问题。
    • @JinalSomaiya 我认为您仍然没有得到我的问题...我只希望所有用户从产品 Eloquent 对象中获得 eloquent 对象。像 Product::find(2)->with('users');绕过评论关系
    • @jigarhalani 但你没有产品和用户模型之间的关系
    • @JinalSomaiya 谢谢。您的回答也是正确的,但我不想使用查询。为您的努力点赞。 :)
    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 2019-06-19
    • 2021-05-16
    • 2016-02-18
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多