Laravel 一对多关系 - 插入
Laravel One-to-Many relation - Insertion
我有 3 个 table:订单、合同、Order_contract.
- 一个合同(可以)有(因为多个订单最终价格可以
连在一起)多个订单
- 但是一个订单可以有一个
合约
我创建了另一个 table (order_contract) 来加入订单和合同。
迁移如下:
public function up()
{
Schema::create('contracts', function(Blueprint $table)
{
$table->increments('id');
$table->timestamps();
});
Schema::create('orders', function(Blueprint $table)
{
$table->increments('id');
$table->integer('price');
$table->timestamps();
});
Schema::create('order_contract', function(Blueprint $table)
{
$table->integer('order_id')->unsigned();
$table->foreign('order_id')->references('id')->on('orders');
$table->integer('contract_id')->unsigned();
$table->foreign('contract_id')->references('id')->on('contracts');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('contracts');
Schema::drop('orders');
Schema::drop('order_contract');
}
我想将数据插入到我的 table 中。
1.插入新合约(插入时我知道$contract->id
)
2. 如果一个订单附加了一个以上的订单,则将每个关系插入 order_contract table
型号:
**Order.php**
class Order extends Eloquent{
protected $fillable = ['price'];
public function contract(){
return $this->belongsTo('Contract');
}
}
**Contract.php**
class Contract extends Eloquent{
public function orders(){
return $this->hasMany('Order','order_contract','order_id','contract_id');
}
}
在这种情况下如何使用 Laravels hasOne(),hasMany(),belongsTo(),belongsToMany() 函数?
当您使用 OneToMany 关系时,您正在创建中间 table。只有在创建 ManyToMany 关系时才需要这样做。
删除 order_contact table,并在您的订单 table 中添加一列 "contract_id"(您可以选择将其设为可为空,这样订单就没有签订合同)。
然后你可以给你的Contract
模型添加一个函数
class Contract extends Eloquent {
public function orders()
{
return $this->hasMany('Order');
}
}
以及您的 Order
模特
class Order extends Eloquent {
public function contract()
{
return $this->belongsTo('Contract');
}
}
那么你可以这样做:
$order1 = new Order;
$order2 = new Order;
$contract = new Contract;
$contract->orders()->saveMany([$order1, $order2]);
上的文档
如果你坚持通过你的中级table你可以这样做:
class Contract extends Eloquent {
public function orders()
{
return $this->hasManyThrough('Order', 'Contract', 'order_id', 'contract_id');
}
}
Note that Eloquent assumes that you have an intermediate model.
不过 Laravel 中没有 BelongsToManyThrough 函数,因此您将不得不编写自己的方法。 hasManyThrough 只是一个快捷方式,并不意味着以这种方式使用...
我仍然建议不要这样做。
我有 3 个 table:订单、合同、Order_contract.
- 一个合同(可以)有(因为多个订单最终价格可以 连在一起)多个订单
- 但是一个订单可以有一个 合约
我创建了另一个 table (order_contract) 来加入订单和合同。 迁移如下:
public function up()
{
Schema::create('contracts', function(Blueprint $table)
{
$table->increments('id');
$table->timestamps();
});
Schema::create('orders', function(Blueprint $table)
{
$table->increments('id');
$table->integer('price');
$table->timestamps();
});
Schema::create('order_contract', function(Blueprint $table)
{
$table->integer('order_id')->unsigned();
$table->foreign('order_id')->references('id')->on('orders');
$table->integer('contract_id')->unsigned();
$table->foreign('contract_id')->references('id')->on('contracts');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('contracts');
Schema::drop('orders');
Schema::drop('order_contract');
}
我想将数据插入到我的 table 中。
1.插入新合约(插入时我知道$contract->id
)
2. 如果一个订单附加了一个以上的订单,则将每个关系插入 order_contract table
型号:
**Order.php**
class Order extends Eloquent{
protected $fillable = ['price'];
public function contract(){
return $this->belongsTo('Contract');
}
}
**Contract.php**
class Contract extends Eloquent{
public function orders(){
return $this->hasMany('Order','order_contract','order_id','contract_id');
}
}
在这种情况下如何使用 Laravels hasOne(),hasMany(),belongsTo(),belongsToMany() 函数?
当您使用 OneToMany 关系时,您正在创建中间 table。只有在创建 ManyToMany 关系时才需要这样做。
删除 order_contact table,并在您的订单 table 中添加一列 "contract_id"(您可以选择将其设为可为空,这样订单就没有签订合同)。
然后你可以给你的Contract
模型添加一个函数
class Contract extends Eloquent {
public function orders()
{
return $this->hasMany('Order');
}
}
以及您的 Order
模特
class Order extends Eloquent {
public function contract()
{
return $this->belongsTo('Contract');
}
}
那么你可以这样做:
$order1 = new Order;
$order2 = new Order;
$contract = new Contract;
$contract->orders()->saveMany([$order1, $order2]);
上的文档
如果你坚持通过你的中级table你可以这样做:
class Contract extends Eloquent {
public function orders()
{
return $this->hasManyThrough('Order', 'Contract', 'order_id', 'contract_id');
}
}
Note that Eloquent assumes that you have an intermediate model.
不过 Laravel 中没有 BelongsToManyThrough 函数,因此您将不得不编写自己的方法。 hasManyThrough 只是一个快捷方式,并不意味着以这种方式使用...
我仍然建议不要这样做。