zoukankan      html  css  js  c++  java
  • Laravel的Eloquent ORM 关联关系中的with用法

    Laravel的Eloquent ORM提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。这个也是本人比较喜欢Laravel的一大原因,同时Eloquent ORM对于数据表关联提供了较为简单关联管理和使用。

    在实际开发中,我们常常会遇到一对多的关联关系,就比如商城来说,一个商品分类会拥有很多个商品,他们的关系如下:

    <?php
    namespace AppModels;
    
    use IlluminateDatabaseEloquentModel;
    
    class Category extends Model
    {
        /**
         * 分类下面的商品
         * @return IlluminateDatabaseEloquentRelationsHasMany
         */
        public function goods()
        {
            return $this->hasMany(Good::class);
        }
    }
    <?php
    namespace AppModels;
    
    use IlluminateDatabaseEloquentModel;
    
    class Good extends Model
    {
        /**
         * 商品所属分类
         * @return IlluminateDatabaseEloquentRelationsBelongsTo
         */
        public function category()
        {
            return $this->belongsTo(Category::class);
        }
    }

    查询某个分类之下的商品可用下面的方法:

    public function goods($categoryId)
    {
         $category = Category::find($categoryId);
         $goods = $category->goods;
         return $goods;
    }

    是不是很简单且优雅呢!好了,回到正题,如果有这样子的一个需求:需要从同一个接口返回分类和属于该分类的商品。面对这样的一个需求,我写出如下的代码:

    public function category($categoryId)
    {
        $category = Category::with('goods')->find($categoryId);
        return $category;
    }
    这里的with方法会将分类之下的商品一起查询出来,而且不会出现N+1影响性能的问题,看来with方法真的不耐啊。在实际项目中,我们往往不是把全部商品查询出来,比如我们要把分类下面上架的商品查询出来,这又该怎么办呢?这里就引申出with方法的第二种用法了:
    public function category($categoryId)
    {
        $category = Category::with(['goods' => function ($query) {
            $query->where('is_sale', true);
        }])->find($categoryId);
        return $category;
    }

    这里的with方法可以理解为给分类下面的商品一个条件,符合该$query->where('is_sale', true);就查询出来,是不是觉得这个with方法特别好用呢!


    作者:Dazoa
    链接:https://www.jianshu.com/p/dad1a9d71c94
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    学习视屏
    Spring 和 MyBatis 环境整合
    struts2 多文件下载
    struts2的单文件下载
    很好的验证码
    Oracle 存储过程
    Oracle序列
    struts2 的多文件上传
    struts2的单文件上传
    NETBEAN 启动报错 CANNOT LOCATE JAVA INSTALLATION IN SPECIFIED JDKHOME的解决办法
  • 原文地址:https://www.cnblogs.com/kangshuai/p/12345924.html
Copyright © 2011-2022 走看看