私は3重ピボットテーブルを可能にし、バッチ挿入をサポートしないlaravelコンポーザパッケージを使用しています。だから私は3つのテーブルからの各IDが私のトリプルピボットテーブル内の一致を持っていることを確認するために各配列をループしているつもりです。私はうまくいきましたが、関数をリファクタリングする方法についていくつか提案したいので、たくさんのネストループを持つ必要はありません。私は配列マップの使用について考えていました。入れ子3深いforeachループをリファクタリングする方法
答えて
これは、Eloquentを使用して解決するのは難しい問題です。現在は不可能かもしれません。最初にわかったように、それは3つの方法のピボットテーブルをサポートしていません。第2に、サポートを追加するために使用しているパッケージは、そのレコードにアイテムを継続的に添付して、同期がないためデータベースに膨大なデータ複製を作成するように見えます。第3に、テーブル内のフィールドにユニークなインデックスを追加して一意のレコードを適用する場合、insert ignore
クエリはサポートされていません。
これを念頭において、raw SQLを使用すると便利です。しかし、SQLでは狂ったことは何もないので、この場合は問題ないと思います。
まず、データベースレベルでデータの整合性を強制する必要があります。これを行う方法は、ピボットテーブルがどのように構造化されているかによって異なります。自動増分主キーであるこのテーブルの列がすでにid
の場合、リンクしようとしている3つのテーブルのIDを含む3つの列に一意のキーを追加する必要があります。 id
または他の主キーがすでに存在しない場合は、これらの3つの列を含む複合主キーを設定できます。
既に重複しているレコードがある場合、これは失敗します。それらの重複を削除してキーを再追加するだけでよいはずです。
これまで述べてきたことを踏まえて、私はバルクインサートを使用するように関数をリファクタリングしました。
function addKeyPhraseToPivotTable($ids) {
$locations = Location::where('account_id', self::$items[0]['account_id'])->get();
$urls = Url::where('account_id', self::$items[0]['account_id'])->get();
$deletes = [];
if ($locations->count() > 0 && $urls->count() > 0) {
foreach ($ids as $keyPhraseId) {
foreach ($locations as $location) {
foreach ($urls as $url) {
$deletes[] = [
'location' => $location->id,
'key' => $keyPhraseId,
'url' => $url->id, // Not sure what the ID is of this item, might need to change it.
];
}
}
}
}
$sql = 'insert ignore into accounts (location_id, key_phrase_id, url_id) values ';
foreach ($deletes as $i => $delete) {
$sql .= $i == 0 ? '' : ',';
$sql .= sprintf('(%s, %s, %s)', $delete['location'], $delete['key'], $delete['url']);
}
DB::unprepared($sql);
}
これは、あなたが持っている各レコードを挿入しなければならないし、挿入を無視しているので、複製を挿入しようとすると壊れません。
DB::unprepared()
は、作成した行の数を返すので、挿入しようとしたアイテムの数が重複していることを知ることができます。しかし、on duplicate key update
を追加した場合、MySQLは更新されて挿入されていない行ごとに2行を返しますので、その場合はおそらく役に立たないでしょう。
- 1. リファクタリングのforeachループは<T> .ForEach(...)
- 2. 入れ子配列のPHP foreachループ
- 3. ILの入れ子の深さを下げる方法は?
- 4. 深く入れ子になったプロパティによるループ - 反応
- 5. forEachループのforEachループでオブジェクトを生成する方法
- 6. Ruby on Railsの深いモデル入れ子
- 7. csvファイルにforeachループを入れる
- 8. Visual Studio 2010でforeachループを自動入力する方法
- 9. 入れ子になったIEnumerable/Arrays、深く入れ子になったプロパティにアクセスする方法
- 10. javascript forEachループを終了する方法
- 11. Javascript forEach - オブジェクトをループする方法は?
- 12. 入れ子の 'for'ループに再帰を使用する方法
- 13. 入れ子ループをベクトル化する方法
- 14. foreachループの修正方法
- 15. foreachループ内でjquery foreach内の値を取得する方法
- 16. angg2で深く入れ子になったjson値を求める方法
- 17. 入れ子ループのよりよい代替方法
- 18. foreachを使用して3次元配列をループする方法PHP
- 19. 入れ子のwhileループをより速く作る方法
- 20. cの入れ子のループを打ち破る方法
- 21. xtendでforeachループを壊す方法は?
- 22. VBA:Forループ/入れ子
- 23. C#入れ子ループ
- 24. foreachループを別のforeachループに挿入するのは安全ですか?
- 25. 深く入れ子にされたコレクションをリセットする最も良い方法は何ですか?
- 26. Foreachループは入力されません
- 27. 入れ子のループをベクトル化する
- 28. 入れ子foreach用のGuavaイテレータ
- 29. 入れ子になったforEach on querySelectors
- 30. 入れ子ループのフローチャートを描く方法は?
おかげで、フローを1つずつ挿入するのではなく、スピードアップする必要があります。 –