【问题标题】:Laravel Eloquent Query Builder (Using query existence, using whereHas)Laravel Eloquent Query Builder(使用查询存在,使用 whereHas)
【发布时间】:2015-11-06 21:22:01
【问题描述】:

表格

PROFILE
id    address    type    approved    fky_profile_vendor_id

VENDOR
id    name

PRODUCT
id    name    price    instock    fky_prod_vendor_id

关系

PROFILE <-(one-to-one)-> VENDOR <- (one-to-many) -> PRODUCT

查询

Eloquent 查询获取所有有货的产品

PRODUCT::where('instock','>',0)->get();

我如何才能获得获准供应商的所有库存产品?

谢谢

K

【问题讨论】:

    标签: laravel eloquent query-builder


    【解决方案1】:

    应用\配置文件

    use Illuminate\Database\Eloquent\Model;
    
    class Profile extends Model {
    
        public function scopeApproved($query)
        {
            return $query->where('approved', 'y');
        }
    
        public function vendor()
        {
            return $this->belongsTo('App\\Vendor');
        }
    
    }
    

    --

    应用\供应商

    use Illuminate\Database\Eloquent\Model;
    
    class Vendor extends Model {
    
        public function profile()
        {
            return $this->hasOne('App\\Profile');
        }
    
        public function products()
        {
            return $this->hasMany('App\\Product');
        }
    
    }
    

    --

    应用\产品

    use Illuminate\Database\Eloquent\Model;
    
    class Product extends Model {
    
        public function vendor()
        {
            return $this->belongsTo('App\\Vendor');
        }
    
    }
    

    使用方法:

    $vendors = Vendor::whereHas('profile', function ($q) { $q->approved(); })->with('products')->get();
    
    $products = $vendors->map(function ($vendor)
    {
        return $vendor->products;
    });
    

    这将返回 Collection 的 Productss 的 Vendors 和批准的 Profile。

    【讨论】:

    • 我需要所有产品 (instock > 0) 仅来自具有批准配置文件 (approved='y') 的供应商
    • 感谢您的努力,但这完全超出了我的想象,我要求您再解释一下“如何使用”部分,尤其是 -&gt;approved() 和 -&gt;map。
    • -&gt;approved 方法是Profile 中的scopeApproved,它基本上只是-&gt;where('approved', 'y') 的别名。 map 只是一种流畅的方法来遍历每个 $vendors 数组(实际上是Collection)。它与foreach ($vendors as $vendor) 基本相同,整个代码所做的是,它获取所有Vendors,并在第一行 上获得批准的配置文件。并遍历每个供应商并将其产品添加到$products 数组第二行和其余。
    • 同样要获得 instock > 0 的Products,您需要将$vendor-&gt;products 更改为$vendor-&gt;products-&gt;filter(function ($product) { return $product-&gt;instock &gt; 0; })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2023-03-07
    • 2019-10-31
    • 2021-05-25
    • 2016-07-25
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多