3

我有一个电子邮件系统,订阅者可以订阅多个列表。在订阅者编辑模式下,我有一个表格,其中列出了所有列表,其中包含检查订阅者订阅的复选框。

到目前为止,一切都很好 :)

但是,我需要在表单提交时处理这些复选框。到目前为止,复选框代码如下所示:

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

提交时将返回以下数据:

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

但这里是“硬”部分。我总是可以循环数组并将订阅者添加到这些列表中,但用户可能已经订阅了这些列表。即使未操作任何复选框,也会发送这些 ID。

我想我可以做的是获取数组中的所有可用列表,标记那些取消订阅和订阅的列表,并忽略那些没有被操纵的列表。唯一的问题是,这听起来有点太复杂了。

你会怎么做?肯定有更简单的方法来做到这一点。最重要的是,如果订阅没有通过复选框进行操作,我不想更新它们。

4

2 回答 2

2

我如何解决它首先是通过创建一个列表数组,其中键是 id,值是检查 (1) 或不检查 (0) 的任何内容。

然后循环通过它来创建复选框。

并在保存时使用array_diff_key来找到它们的值发生变化的那些。然后将差异保存在数据库中。

有人建议使用INSERT IGNORE,但是对于大量数据来说效率很低。PHP 中的处理应该更快(因为无论如何您都需要从数据库中提取这些数据 - 以显示 checkbxes,因此您已经拥有它并且数据库没有真正的开销)。

于 2013-02-01T12:58:39.840 回答
2

感谢您的建议。我没有提到我使用 Laravel 作为框架,他们有一个功能可以解决这样的问题。

我使用以下代码解决了它:

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

现在这让我的关系保持同步:)

于 2013-02-01T13:16:35.007 回答