【问题标题】:Eloquent doesn't update all records in MySQLEloquent 不会更新 MySQL 中的所有记录
【发布时间】:2013-10-19 05:15:44
【问题描述】:

我想要做的是将 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';
}

【问题讨论】:

  • 你有什么错误吗?
  • 连接 TableA.ibooks_id = TableB.book_id 的记录是否只有 19 条?加入的结果是什么?您能否发布更新的 19 行和未更新的一些行?

标签: mysql model laravel laravel-4 eloquent


【解决方案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 ;

然后当你想使用它时(如果不是临时),只需在 Eloquent 中对 MySQL CALL sp_changeTableB_book_id 进行编码

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

【讨论】:

    【解决方案2】:

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

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

    选择 * 从表 A 在 tableA.ibooks_id 上加入 tableB = TableB.book_id

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2015-12-05
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多