Eloquent不会更新MySQL中的所有记录

时间:2013-10-11 07:41:03

标签: mysql model laravel laravel-4 eloquent

我想要做的是将 TableB 字段 book_id 中的所有记录更新为等于 TableA book_id < / strong>即可。但它只更新了一些记录,确切地说是<7> 2886 中的19个。

我多次这样做,希望随后的19条记录更新最终会达到7862,但令我困惑的是它仍然是19条。

TableA:
book_id
ibooks_id -> equal to TableB.book_id

TableB:
book_id -> change to TableA.book_id

我试过的代码:

$books = TableAModel::join("TableB", "TableA.ibooks_id", '=', "TableB.book_id")
                    ->update(array("TableB.book_id" => "TableA.book_id"));

还有:

$tableBItems = TableBModel::all();
    TableBModel::unguard();
    foreach($tableBItems as $tableBitem) {
        $TableAItem = TableAModel::where('ibooks_id',$tableBitem->book_id)->first();
        if(isset($TableAItem->book_id)) {
            $tableBitem->book_id = $TableAItem->book_id;
            $tableBitem->save();
        }
    }

你有更好的方法吗?或者这可能是通过纯mysql查询完成,谢谢。

型号:

class TableBModel extends Eloquent {

    public $table = 'TableB';
    public $timestamps = false;
}
class TableAModel extends Eloquent {

    protected $table = 'TableA';
    public $primaryKey = 'book_id';
}

2 个答案:

答案 0 :(得分:1)

我说使用任何类型的RDBMS / SQL的好习惯是让SQL引擎尽可能多地执行SELECTINSERTUPDATEDELETE尽可能为此类工作进行高度优化。如果您计划在应用程序中多次执行相同的操作,只需将其写入MySQL中的过程,例如:

CREATE PROCEDURE sp_changeTableB_book_id();
DELIMITER //
BEGIN

-- you can leave out the code above if running ad-hoc query, but replace // below with ;

UPDATE TableB INNER JOIN TableA
ON TableB.book_id = TableA.ibooks_id
SET TableB.book_id = TableA.book_id//

-- you can leave out the code below if running ad-hoc query

END//
DELIMITER ;

然后当你想要使用它时(如果不是ad-hoc)只需在Eloquent to MySQL CALL sp_changeTableB_book_id中编码

您可能对this post on Code Review感兴趣,看看在SQL中使用存储过程执行此操作的一些优点。

答案 1 :(得分:0)

首先,您需要检查查询返回的行。因此,不是直接更新它,而是首先执行select *来计算返回的行数,因为这些行将被更新。

样本是 oin(“TableB”,“TableA.ibooks_id”,'=',“TableB.book_id”)

选择* 来自tableA 在tableA.ibooks_id = TableB.book_id

上加入tableB

使用此查询,您将能够获得join子句正在工作的行数。

您尝试的第二种方法也非常昂贵,您获得所有行,然后再次在所有行上运行for循环,在每次迭代中您都在执行另一个数据库查询。