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

标签 mysql model laravel laravel-4 eloquent

我想做的是将 TableBbook_id 字段中的所有记录更新为等于 TableA book_id。但它只更新了一些记录,准确地说是 7862 条中的 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';
}

最佳答案

我说使用任何类型的 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 ;

然后当你想使用它时(如果不是临时的)只需在 Eloquent 中编写代码到 MySQL CALL sp_changeTableB_book_id

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

关于mysql - Eloquent 不会更新 MySQL 中的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19312811/

相关文章:

ruby-on-rails - 使用 RSpec 和 Rails 在模型中测试验证

django - 合并必须至少采用两个表达式

laravel - 采多列?

laravel 应用程序已移至另一台电脑

php - 查询 Laravel 深夜营业时间

mysql - SQL 比较行并显示同一表中列的差异

mysql - if 是或否状态 mysql 查询

php - 如何替换 mySQL 行中包含多个以逗号分隔的字符串的字符串?

mysql - 您的 SQL 语法有误;查看与您的 MariaDB 服务器版本对应的手册,了解在附近使用的正确语法

model-view-controller - 访问模型中的 Symfony 用户 session (Doctrine)