• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Laravel 模型关联基础教程详解

    在 Laravel 中定义模型关联是每个 Laravel 开发者可能已经做过不止一次的事情。但是在试图实现关联时可能会遇到各种问题。因为 Laravel 有各种各样的关联,你应该选择哪一个?当涉及到查询模型时,我们如何充分利用模型关联的功能?

    Laravel 的模型关联可能会让人糊涂。如果你不完全理解 Laravel 的关联在这一点上是如何工作的,别担心,读完这篇文章后,你会更好地理解它。

    我们应该使用哪个模型关联?

    要回答这个问题,首先你要知道有哪些可用的选项。Laravel 有 3 种不同的关联类型。

    我们将逐个探讨不同的关联类型并解释一下应该什么时候使用它们。

    一对一

    一对一关联是目前存在的最基本的关联。这种关联意味着 A 模型只能链接到 B 模型,相反也是如此。举个例子,一个 User 模型和一个 Passport 模型会成为一对一的关联。一个用户只能拥有一张通行证,同样,一张通行证也只属于一个用户。

    让我们看看如何在代码中定义这种关联。

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model
    {
      public function passport() {
        return $this->hasOne(App\Passport::class);
      }
    }
    

    在 User 模型中我们创建了一个 passport 方法。我们通过 hasOne 方法告诉 Laravel User 模型有一个 Passport 。

    注意:
    所有用于定义关联的方法都有可选的额外参数,你可以在这些参数中定义本地键和外键。默认情况下,Laravel会假设你在用户模型中定义了 passport_id ,因为你试图创建与 passport 模型的关联。创建迁移文件时也请注意这一点!

    在 Passport 模型中,我们需要定义逆向的关联。我们要让 Passport 模型知道它属于 User 模型。我们可以使用 belongsTo 方法来实现这一点。

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Passport extends Model
    {
      public function user() {
        return $this->belongsTo(App\User::class);
      }
    }
    

    一对多

    你可以在 Laravel 中定义的下一个关联是一对多关联。 这种类型的关联意味着一个类型A的模型可以链接到多个类型B的模型。但是类型B的模型只属于一个类型A的模型。

    例如,User 模型和 Invoice 模型之间的关联是一对多关联。 用户可以拥有多个账单,但账单仅属于一个用户。

    在代码中是这样写的:

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model
    {
      public function invoices() {
        return $this->hasMany(App\Invoice::class);
      }
    }
    

    它看起来就像我们之前用于定义一对一关联的代码,对吧?

    我们现在要做的就是让 Invoice 模型知道它属于 User 模型。 让我们定义一对多关联的反向对应关联吧。

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Invoice extends Model
    {
      public function user() {
        return $this->belongsTo(App\User::class);
      }
    }
    

    多对多

    最后要定义的关联是多对多关联。 这种类型的关联意味着类型A的一个模型可以链接到类型B的多个模型,反之亦然。

    例如,Invoice  模型和 Product  模型之间的关联将是多对多关联。 账单可以包含多个产品,而产品可以属于多个账单。

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Invoice extends Model
    {
      public function products() {
        return $this->belongsToMany(App\Product::class);
      }
    }
    

    你可以像这样定义这种关联的反向关系:

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Product extends Model
    {
      public function invoices() {
        return $this->belongsToMany(App\Invoice::class);
      }
    }
    

    多对多关联实现起来稍微困难一些,因为它们需要数据库中的中间表。 你可以通过创建迁移文件在 Laravel 中创建此中间表。

    远程关联

    远程一对一

    has one through 关联通过单个中间关联模型实现。 如果每个供应商都有一个用户,并且每个用户与一个用户历史记录相关联,那么供应商可以通过用户访问用户的历史记录。

    这就是定义这种关联所需的数据库表:

    suppliers:
    - idproducts:
    - id
    - supplier_idproduct_history:
    - id
    - product_id
    

    即使 product_history 表不包含 supplier_id 列,供应商也可以通过使用 「has one through」 关系访问 product_history 记录。

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Supplier extends Model
    {
      public function productHistory() {
        return $this->hasOneThrough(App\History::class, App\Product::class);
      }
    }
    

    传递给 hasOneThrough 方法的第一个参数是希望访问模型的名称。 第二个参数是中间模型的名称。

    远程一对多

    「has many through」 关联相当于 「has one through」 关联,只是对于多个记录的。 让我们使用前面的示例,但我们改变一件事:产品现在可以有多个历史条目而不是一个。 数据库表保持不变。

    ?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Supplier extends Model
    {
      public function productHistory() {
        return $this->hasManyThrough(App\History::class, App\Product::class);
      }
    }
    

    这样,供应商模型可以访问产品的历史记录条目。

    查询关联

    查询一个关联非常简单。因为我们定义了 Passport 的一对一关联和 Invoice 的一对多关联,所以我们可以在 User 模型中使用它们。在 User 模型的每个实例上,我们都可以得到对应的 Passport 和 Invoice。

    ?php
    $user = \App\User::find(1);
    
    // 查询 passport 关联
    $user->passport->expiration_date;
    
    // 查询 invoice 关联
    foreach($user->invoices as $invoice) {
      $invoice->total_amount;
    }
    
    

    也可以查询关联的反向关联。 如果您有账单,则可以获得该账单的用户。

    ?php
    $invoice = \App\Invoice::find(1);
    // Get the user
    $invoice->user->first_name;
    

    查询多对多关联的工作方式与其他关联完全相同。 此外,多对多关联有一个pivot 属性。 此属性表示中间表,可以像任何其他模型一样使用。

    举个例子,假设连接的表有 created_at 字段,我们就可以使用 pivot 来获取 created_at 字段。

    ?php
    $invoice = \App\Invoice::find(1);
    // 获取 product 的 `created_at` 字段
    foreach($invoice->products as $product) {
      $product->pivot->created_at;
    }

    查询 has one through 和 has many through 的工作方式与其他关联完全相同。

    添加约束

    可以在查询时向关系添加约束。看看下面的示例:

    ?php
    $user->passport()->where('active', 1)->orderBy('expiration_date');
    

    检查关联是否存在

    有时候你希望检查模型中是否有添加某些关联, Laravel有一些方法可以帮助你用来检查:

    ?php
    // 找到拥有护照的所有用户
    $users = App\User::has('passport')->get();
    
    // 找到没拥有护照的所有用户
    $users = App\User::doesntHave('passport')->get();
    
    // 找到拥有 5 个及以上产品的发票
    $invoices = App\Invoice::has('products', '>=', 5)->get();
    
    

    希望这篇文章能让你对Laravel的模型关联有更好的理解。谢谢你的阅读!也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Laravel 关联模型-关联新增和关联更新的方法
    • Laravel关联模型中过滤结果为空的结果集(has和with区别)
    • laravel学习教程之关联模型
    • Laravel5.1 框架模型多态关联用法实例分析
    • Laravel等框架模型关联的可用性浅析
    • Laravel Eloquent分表方法并使用模型关联的实现
    • Laravel5.1 框架模型远层一对多关系实例分析
    • Laravel5.1 框架模型一对一关系实现与使用方法实例分析
    • Laravel5.1 框架模型查询作用域定义与用法实例分析
    • Laravel5.1 框架模型创建与使用方法实例分析
    • Laravel5.1 框架关联模型之后操作实例分析
    上一篇:PHP实现的微信APP支付功能示例【基于TP5框架】
    下一篇:php探针不显示内存解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Laravel 模型关联基础教程详解 Laravel,模型,关联,基础,教程,