【问题标题】:Laravel Eloquent Model with relationshipLaravel Eloquent 模型与关系
【发布时间】:2021-07-04 23:33:42
【问题描述】:

我已经在我的代码中实现了 eloquent 关系,但是 Laravel 无法读取我创建的用于在模型中映射 eloquent 关系的函数。

用户模型

public function products(){
        return $this->hasMany(Product::class,'userid');
    }

产品型号

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

产品控制器

 $products = Product::with('Users')->Users()->where('users.isActive',1)->get();
        return view('product',compact('products'));

我不断收到来自产品控制器的错误,我还附上了我当前遇到的错误,如下所示。

我怎样才能得到所有带有 where 条件的产品和用户数据,例如“Users.isActive = 1”。

谢谢。

【问题讨论】:

    标签: php laravel eloquent eloquent-relationship


    【解决方案1】:

    您可以使用whereHas 过滤关系。

    $products = Product::with('users')
        ->whereHas('users', function ($query) {
            $query->where('isActive', 1);
        })
        ->get();
    

    此外,对belongsTo 关系使用单数名词通常是一个好主意,因为它返回的是一个对象,而不是一个集合。

    public function user() {
        return $this->belongsTo(User::class);
    }
    
    $products = Product::with('user')
        ->whereHas('user', function ($query) {
            $query->where('isActive', 1);
        })
        ->get();
    

    编辑

    如果你想用产品检索用户,你应该使用用户模型查询。

    $users = User::with('products')
        ->where('isActive', 1)
        ->get();
    

    然后您可以通过

    检索用户和产品
    foreach($users as $user) {
        $user->products;
        // or
        foreach($users->products as $product) {
            $product;
        }
    }
    

    【讨论】:

    • 其实我的预期输出低于ibb.co/5W2J5CJ
    • 我已经测试了您提供的解决方案,但它只会返回产品数据集,而不是产品和用户的数据集。我已经测试在 ->get('users.*') 中添加特定的列选择,但它无法显示用户数据。
    • @MiracleHades 您可能想使用用户模型进行查询,请参阅更新后的答案
    【解决方案2】:

    您可以为此目的使用whereHas() 方法。 Here is the doc

    $products = Product::with('users')->whereHas('users', function (Illuminate\Database\Eloquent\Builder $query) {
        $query->where('isActive', 1);
    })->get();
    
    $users = $products->pluck('users');
    
    return view('product',compact('products'));
    

    【讨论】:

    • 其实我的预期输出低于ibb.co/5W2J5CJ
    • 我已经测试了您提供的解决方案,但它只会返回产品数据集,而不是产品和用户的数据集。我已经测试在 ->get('users.*') 中添加特定的列选择,但它无法显示用户数据。
    • @MiracleHades 你应该通过$products->pluck('users') 获得users,因为它是一个laravel 集合
    【解决方案3】:

    with 后面有错字,是 users 而不是 Users,而且您对查询生成器有多余的了解,请删除 ->Users()

    之前:

    $products = Product::with('Users')->Users()->where('users.isActive',1)->get();
            return view('product',compact('products')); 
    

    之后:

    $products = Product::with('users')->where('users.isActive',1)->get();
                return view('product',compact('products')); 
    

    解决这个问题,一切都应该工作。

    【讨论】:

    • 但我无法打印用户表中的数据。
    • 试试 Anurat 的回答,这是一个更好的方法。
    • 同样出现错误,截图:ibb.co/b6zdqrd
    • 但是生成的查询是错误的,应该是SELECT products.*,users.* FROM products INNER JOIN users ON products.userid = users.id WHERE users.email = 'oops@example.com ';
    猜你喜欢
    • 2016-02-26
    • 2020-10-26
    • 2021-10-01
    • 2018-10-20
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多