Laravel 推送一对一关系

Laravel push a one-to-one relation

我的产品与其对应的价格是一对一的关系。我想做的是,当我创建新产品时,新产品存储在 "products" table 中,但价格也保存在 "prices" table,包括 "products_id"。这是我现在拥有的:

产品型号:

class Products extends Eloquent {

    public function prices()
    {
        return $this->hasOne('Prices');
    } 
}

价格模型:

class Prices extends Eloquent {

    public function products()
    {
        return $this->belongsTo('Products');
    }
}

控制器存储方法:

$product = new Products;
$product->name = Input::get('name');

$product->prices->price = Input::get('price');

$product->push();

不过我收到一个错误:

间接修改重载属性 Products::$prices 无效

dd 我的 $product:

object(Products)#606 (20) {
    ["fillable":protected]=> array(3) {
       [0]=> string(4) "name"
       [1]=> string(8) "selected"
       [2]=> string(6) "number"
    }
    ["connection":protected]=> NULL 
    ["table":protected]=> NULL
    ["primaryKey":protected]=> string(2) "id"
    ["perPage":protected]=> int(15)
    ["incrementing"]=> bool(true)
    ["timestamps"]=> bool(true) 
    ["attributes":protected]=> array(0) { }
    ["original":protected]=> array(0) { } 
    ["relations":protected]=> array(0) { }
    ["hidden":protected]=> array(0) { } 
    ["visible":protected]=> array(0) { } 
    ["appends":protected]=> array(0) { }
    ["guarded":protected]=> array(1) {
       [0]=> string(1) "*"
    }
    ["dates":protected]=> array(0) { }
    ["touches":protected]=> array(0) { }
    ["observables":protected]=> array(0) { }
    ["with":protected]=> array(0) { }
    ["morphClass":protected]=> NULL
    ["exists"]=> bool(false)
}

现在使用正确的命名约定和以下代码修复了它:

        $product        = new Product;
        $product->name      = Input::get('product');
        $product->category_id   = Input::get('category');
        $product->save();

        $price          = new Price;
        $price->price       = Input::get('price');
        $price->save();

        $product->price()->save($price);

在这里找到答案:

laravel: eloquent example insert data to database

更新数据及其关系时可以使用推送,但第一次创建时必须先保存产品再保存价格。

    $product = new Products();
    $product->name = 'pro2';
    $product->save();

    $price=new Prices();
    $price->price=3;


    $product->prices()->save($price);

此外,您应该使用事务来使数据处于一致状态。