Laravel更新语法 - 使用数组更新记录

21

我在Laravel中使用POST方式进行基本记录更新时遇到了问题。

我已经将所有的POST数据捕获到一个数组中,如果现有的订单号是0,则创建一个新的记录(运行正常)。否则,我将更新现有记录。

Order.php

class Order extends Eloquent {
    public static $table = 'my_orders';
}

路由.php

//Handle a new order POST
Route::post('order', array('do' => function() {
    $thisOrder = array(
         'qty' => Input::get('quantity'),
         'desc' => Input::get('description'),
    );

    $thisOrderID = Input::get('orderNo');

    //CHECK FOR NEW OR EXISTING ORDER
    if($thisOrderID > 0) {
        //THIS FUNCTION SOMEHOW RETURNS THE FUNCTION CALL AND DOESNT CONTINUE PAST
        //AND THE RECORD IS NOT UPDATED
        $updateOrder = Order::update($thisOrderID, $thisOrder);
    }
}

更新: 上述代码实际上是有效的。我有一个验证错误,导致函数提前返回。

3个回答

28

不要更改以下这行:

$updateOrder = Order::update($thisOrderID, $thisOrder);

你需要做:

$updateOrder = Order::find($thisOrderID)->update($thisOrder);

使用find()(等同于where_id())可以从数据库中选择特定的行,使用update则将新数据传递。


如果这个能够正常工作,那就是我正在寻找的。Laravel文档中有没有相关记录?我已经仔细查看过了。这会返回一个布尔值吗? - jamis0n
一个优雅的模型可以通过它的属性进行调整。但也可以使用 Laravel 的本地数据库模型 Fluent 进行调整。文档中提到了这一点:http://laravel.com/docs/database/fluent#update - markvaneijk
原来$updateOrder = Order::update($thisOrderID, $thisOrder);完全没问题。我在验证过程中出现了错误,这就是为什么我得到了意外的返回结果。 - jamis0n
第二种方式不会使查询翻倍吗? - Ulugov

3
你对这个有什么看法:
//Handle a new order POST
Route::post('order', array('do' => function() {
    $thisOrder = array(
         'qty' => Input::get('quantity'),
         'desc' => Input::get('description'),
    );

    $thisOrderID = Input::get('orderNo');

    $order = Order::find( $thisOrderID );

    //CHECK FOR NEW OR EXISTING ORDER
    if( $order ) {
        $order->title = 'New order title';
        $order->desc = 'New description';
        $order->save();
    }
}

这个方法在更新几个字段时效果很好,但如果有多个字段需要更新,那么这个方法会变得很繁琐和冗余,因为它们已经在数组中定义了。我希望@MarkVanEijk上面的答案是正确的。 - jamis0n

2

嗯,我建议按照以下方式操作:如果$thisOrder包含该键,则只更新记录,否则将创建一个新的记录。

$thisOrder = array(
     'orderNo' => Input::get('orderNo'),
     'qty' => Input::get('quantity'),
     'desc' => Input::get('description'),
);

$updateOrder = Order::save($thisOrder);

如果Input::get('orderNo')没有值,那么不会创建任何内容,否则会进行更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接