1

私がしたいのは、 TableB のフィールドbook_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 query を介して行うことができます、ありがとう。

モデル:

class TableBModel extends Eloquent {

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

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

2 に答える 2

0

まず、クエリが返す行を確認する必要があります。したがって、直接更新するのではなく、最初に select * を実行して、返される行数をカウントします。これらの行は更新されるからです。

サンプルは oin("TableB", "TableA.ibooks_id", '=', "TableB.book_id")

選択 * from tableA join tableB on tableA.ibooks_id = TableB.book_id

このクエリを使用すると、結合句が機能している行の数を取得できます。

また、試した2番目のアプローチは非常に高価です。すべての行を取得し、すべての行に対してforループを実行しています。繰り返しごとに別のDBクエリを実行しています。

于 2013-10-31T14:20:02.957 に答える