Laravel一对多关系 - 插入

时间:2015-01-18 15:00:28

标签: join laravel-4 relationship belongs-to

我有3个表:订单合同订单合同

  • 一份合同(可以)(因为多个订单的最终价格可以是 联合起来)多个订单
  • 但是一个订单可以有一个 合同

我创建了另一个表(order_contract)来加入Orders和Contracts。 迁移如下:

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');
}

我想在我的表格中插入数据。 1.插入新合同(插入时我知道$contract->id) 2.如果一个订单附加了多个订单,则将每个单一关系插入order_contract表

型号:

**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()函数?

1 个答案:

答案 0 :(得分:1)

当您使用OneToMany关系时,您正在创建一个中间表。您只需在创建ManyToMany关系时这样做。

删除order_contact表,并在订单表上添加一列“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]);

查看Attaching A Related Model

上的文档

如果您坚持通过中间表执行此操作,则可以这样做:

class Contract extends Eloquent {

    public function orders()
    {
        return $this->hasManyThrough('Order', 'Contract', 'order_id', 'contract_id');
    }
}
  

请注意,Eloquent假设您有一个中间模型。

但是Laravel中没有BelongsToManyThrough函数,因此您将不得不编写自己的方法。 hasManyThrough只是一个快捷方式,不应该以这种方式使用......

我仍然建议不要这样做。