3

購読者が複数のリストを購読できる電子メールシステムがあります。サブスクライバー編集モードでは、サブスクライバーがサブスクライブしているリストがチェックされているチェックボックスを使用して、すべてのリストがリストされているテーブルがあります。

ここまでは順調ですね :)

ただし、フォームの送信時にこれらのチェックボックスを処理する必要があります。これまでのところ、チェックボックスコードは次のようになっています。

<input type="checkbox" name="lists[]" value="<?= $list->id ?>" />

これにより、送信時に次のデータが返されます。

array(2) {
    [0]=> string(1) "7"
    [1]=> string(1) "8"
}

しかし、ここが「難しい」部分です。いつでも配列をループしてサブスクライバーをそれらのリストに追加できますが、ユーザーはすでにそれらのリストにサブスクライブしている可能性があります。これらのIDは、チェックボックスが操作されていない場合でも送信されます。

私ができると思うのは、利用可能なすべてのリストを配列で取得し、サブスクライブされていないリストとサブスクライブされているリストにフラグを付け、操作されていないリストを無視することです。唯一のことは、これは少し複雑すぎるように聞こえるということです。

これをどのように行いますか?確かにこれを行うためのより簡単な方法があるはずです。肝心なのは、チェックボックスを介して操作されていない場合、サブスクリプションを更新したくないということです。

4

2 に答える 2

2

ご提案いただきありがとうございます。フレームワークとして Laravel を使用していることは言うまでもありませんが、Laravel にはまさにこのような問題を解決する機能があります。

次のコードを使用して解決しました。

$subscriber = Subscriber::find(Input::get('subscriber_id'));
$subscriber->maillist()->sync(Input::get('lists'));

これで関係が同期されます:)

于 2013-02-01T13:16:35.007 に答える
2

私がそれを解決する方法は、最初にリストの配列を作成することです。ここで、キーはIDであり、値はチェックされているもの(1)またはチェックされていないもの(0)です。

次に、それをループしてチェックボックスを作成します。

そして、保存時にarray_diff_keyを使用して、値が変更されたこれらを見つけます。次に、差分を DB に保存します。

誰かが使用を提案しINSERT IGNOREましたが、大量のデータでは非常に非効率的です。PHPでの処理ははるかに高速になるはずです(チェックボックスを表示するには、データベースからこれらのデータを取得する必要があるため、すでにチェックボックスがあり、データベースに実際のオーバーヘッドはありません)。

于 2013-02-01T12:58:39.840 に答える