Laravel 模型关联基础教程详解(2)
它看起来就像我们之前用于定义一对一关联的代码,对吧?
我们现在要做的就是让 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); } }
内容版权声明:除非注明,否则皆为本站原创文章。