我会尽我所能尝试解释这个。我有一个包含多种角色类型的应用程序。在这种情况下,唯一重要的两个是“经理”和“代表”。创建代表后,会将其分配给该公司内的一个或多个经理(公司在创建经理时分配)。请注意,所有用户都存储在名为Users的同一个表中。
当创建管理员关系的代表时,代表的PRIMARY KEY(在我的情况下是用户表中的'userId'列)和经理的主键被推送到名为ManagerRepRelationship的表中。因此,例如,如果我有以下用户表(仅用于处理在这种情况下重要的列):
userId | username | role | accountId |
______ ________ ______________ _________
1 jsmith manager 14
2 mfoster manager 14
3 lcarter manager 18
4 jdoe representative 14
5 tlarson representative 18
6 rhoward representative 18
代表只能分配给他们帐户中的经理,所以如果上面的表看起来那样,ManagerRepRelationship可能如下所示:
repId | managerId
_____ _________
4 1
5 3
6 3
我遇到的麻烦就是编辑这些关系。目前我有一个单独的表单和页面JUST来处理这些关系更改,因为它将是一个非常有限的页面。让我们说在这种情况下,我们将编辑代表jdoe
并指派给他另一位经理。目前他刚刚被分配到jsmith
,但我们想给他两个经理,所以我们也将他分配到mfoster
。在这种情况下,页面的URL将类似于:
http:localhost:8888/mod-super-admin/edit-relatoinship.php?repId=4&accountId=14
在页面顶部,我抓住该帐户的所有管理员(请注意下面查询中的地址表就是我为用户提供个人信息的地方,它与此问题无关。您会注意到我甚至没有在上面的Users表中包含addressId。我没有为此页面上的Address表更新任何内容我只想要我的<select>
选项的管理器的名字和姓氏
// Get the url variables
$rep_id = $_GET["repId"];
$account_id = $_GET["accountId"];
// grab all managers tied to the account (not the rep)
$manager_sql = "SELECT Users.userId, Address.firstName, Address.lastName FROM Users JOIN Address ON Users.addressId=Address.addressId WHERE Users.role='manager' AND Users.accountId=" . $account_id;
$account_managers = mysqli_query($connection,$manager_sql);
// grab all managers assigned to the rep
$relationship_sql = "SELECT managerId FROM ManagerRepRelationship WHERE repId=" . $rep_id;
$rep_rels = mysqli_query($connection, $relationship_sql);
// create and array that houses current assigned managers
$current_managers = array();
while($row = mysqli_fetch_array($rep_rels)){
array_push($current_managers, $row["managerId"]);
}
表格如下。如果已经分配,它将突出显示经理。
<form method="POST" action="./mod-super-admin/edit-relationship.php?repId=<?php echo $rep_id; ?>&accountId=<?php echo $account_id; ?>">
<div class="col-sm-12">
<div class="form-group">
<div class="form-group mbs">
<label for="manager" class="label-medium">Assigned Managers</label><br>
<small>To Select Multiple Managers Hold Down CTRL (CMD for Mac) and click</small>
<select name="manager[]" class="form-control input-medium" multiple="multiple">
<?php
$output;
while($manager = mysqli_fetch_assoc($account_managers)) :
$output .= '<option value="' . $manager["userId"] . '"';
foreach($current_managers as $key=>$value) :
if( $value === $manager["userId"]){
$output .= ' selected';
}
endforeach;
$output .= '>' . $manager["lastName"] . ', ' . $manager["firstName"] . '</option>';
endwhile;
echo $output;
?>
</select>
</div>
<input type="submit" name="editRelationshipSubmit" class="btn btn-large btn-green mtm" value="Update Relationship">
</div>
</div>
</form>
在我们的案例中,上面的PhP将输出一个带有管理者名称的mutliselect,如果管理员被分配给代表,它将被突出显示。这是我遇到麻烦的部分。在编辑这些版权时。例如,我了解我是否只需将mfoster
作为管理员添加到jdoe
我将在INSERT INTO
上运行ManagerRepRelationship
或者如果我要删除jsmith
作为经理,我会运行DELETE FROM ManagerRepRelationship WHERE repId=4 AND managerId=1
。
如何补偿发生的事情?我不知道当前用户进行这些更改是否会添加管理员关系,删除管理员关系,也许他们会做两件事。
我创建了$current_managers
数组,因此我可以在提交表单时针对数组$_POST["manager"];
进行检查。我应该注意到阵列所包含的唯一数据是userId
。我只是坚持运行不同的SQL命令来根据这些数组的比较来更新我的数据库。我希望我能很好地解释我所处的情况。
答案 0 :(得分:2)
我认为这是一个相当普遍的问题。我总是解决这种问题的方式可能有点简单,但它的工作原理很容易实现。而不是试图弄清楚改变了什么(例如删除了2个管理器,添加了1个,保留了1个)然后只插入/删除了正确的行,我总是采取简单地删除所有现有行的方法然后插入一整套与用户输入的数据相关的全新的。
因此,在您的情况下,让我们说用户选择代表4,然后编辑选定的经理,以便他们选择经理3,7和8.(N.B.之前选择的内容无关紧要)。那么你就可以对数据库运行以下命令:
delete from ManagerRepRelationship where repId = 4;
insert into ManagerRepRelationship (repId, managerId) values (4, 3);
insert into ManagerRepRelationship (repId, managerId) values (4, 7);
insert into ManagerRepRelationship (repId, managerId) values (4, 8);
显然,您希望使用循环根据GUI中选择的值生成插入语句。
通过这种方式,您不必担心将之前的内容与现在的内容进行比较。
P.S。确保在所有SQL操作中使用事务处理,以便在处理过程中发生错误时不会遇到错误的信息。