6

sync()メソッドlaravelを使用すると、次のように中間テーブルで多くの個別の挿入クエリを実行します。

INSERT INTO `tag_user` (`user_id`, `tag_id`) VALUES ('59', '60')
INSERT INTO `tag_user` (`user_id`, `tag_id`) VALUES ('59', '61')

次のように複数の挿入を1回実行したい:

INSERT INTO `tag_user` (`user_id`, `tag_id`) VALUES ('59', '60'), ('59', '61')

出来ますか?私はMySqlを使用しています。attach()メソッドと同じように配列を受け入れるメソッドがあると便利ですdetach()。誰かがこれをしましたか?

4

3 に答える 3

1

ええ、私は数日前に同じことをしていましたが、

雄弁は1つのSQLで複数の挿入を行います。

しかし、すべてのループが等しい列とフィールドであることを確認してください。初めて値を持たないものを削除しようとしましたが、mysqlは機能しません...

例えば:

array(
    array('name' => 'blah'),
    array('name' => 'blah')
)
User::insert($data)

ただし、既存のレコードを更新する場合は、生のクエリを実行する必要があります。

例えば:

$keyString = '("';
$valString = '("';
foreach ($blah as $k => $v) {
     $keyString .= $k . '", '
}

目標は、このようなものを返すことです

$keyString // (name, email, bla, bla)
$valString // ('john doe', 'email@email.com', 'bla', 'bla'), ('someone', 'email@email.com', 'bla', 'bla'), 

よりも

DB::query( 'replace into users' . $keyString . ' values ' . $valString );

配列カウントを使用して、カンマの最後の配列であるかどうかを確認してください

例えば:

(++counter === count ? '),' : ')' ;

これはリファクタリングする必要があります

于 2012-11-18T00:17:22.083 に答える
1

回避策は、Laravel のものを使用しDB::transaction()、同期をクロージャーとして配置することです。

于 2013-01-27T17:55:51.227 に答える
1

これは私がそれを解決した方法です:

私のモデル

私のアプリケーションでは、各ユーザーに多くのタグがあります(多対多の関係)。これは、toxiデータベース スキーマと呼ばれます。私のユーザーテーブルは「ユーザー」と呼ばれ、タグテーブルは「タグ」と呼ばれます。そして、中間テーブルは「tag_id」と「user_id」列を持つ「tag_user」と呼ばれます。

ユーザーモデル:

class User extends \Eloquent 
{
    public static $timestamps = false;

    public function tags()
    {
          return $this->has_many_and_belongs_to('Models\Tag');
    }
}

タグモデル:

class Tag extends \Eloquent 
{
    public static $timestamps = false;
}

sync()メソッドをどのように置き換えたか

これは、laravelにsync()複数の挿入を使用してメソッドを実行させる方法です:

//$currentUser is a model loaded from database
//Like this: $currentUser = Auth::user();

$newLinks = array();
$idsToSync = array();

foreach ($tags as $tag)
{
    array_push($idsToSync, $tag->id);
}

//$currentUser->tags()->sync($idsToSync);

$currentIds = $currentUser->tags()->pivot()->lists('tag_id');

$idsToAttach = array_diff($idsToSync, $currentIds);

foreach ($idsToAttach as $value)
{
    $newLink = array(
                    'user_id' => $currentUser->id,
                    'tag_id' => $value
                     );

    $newLinks[] = $newLink;
}        

if (count($newLinks) > 0)
{
    \DB::table('tag_user')->insert($newLinks);
}

$idsToDetach = array_diff($currentIds, $idsToSync);

if (count($idsToDetach) > 0)
{
    $currentUser->tags()->detach($idsToDetach);
}

このコードは、多数の単一の挿入ではなく、1 つの複数の挿入を行います。

于 2012-11-18T08:26:23.697 に答える