2016-04-29 4 views
0

Я собираюсь сделать все возможное, чтобы попытаться объяснить это. У меня есть приложение, которое содержит несколько типов ролей. В этом случае важны только два «менеджера» и «представитель». Когда создается представитель, они назначаются одному или нескольким менеджерам внутри этой компании (компания назначается при создании менеджера). Обратите внимание, что все пользователи хранятся в той же таблице, что и «Пользователи».SQL DELETE, UPDATE или INSERT на основе сравнения массивов

Когда этот представитель связывается с менеджером (ами), PRIMARY KEY (в моем случае столбец «userId» в таблице пользователя) для представителя и первичный ключ для менеджера вставляются в таблицу с именем ManagerRepRelationship , Так, например, если у меня есть следующая таблица Users (только собираюсь работать с перевалами, которые имеют значения в данном случае):

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

На верхней части страницы, я хватаю все менеджер для этой учетной записи (обратите внимание на таблицу адресов в поле ниже запросе только там, где я вы не заметите, что я даже не включил addressId в таблицу «Мои пользователи» выше. Я ничего не обновляю для таблицы «Адрес» на этой странице, я просто хочу, чтобы первая и фамилия менеджеров для моих <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

Слишком длинный вопрос: o –

+0

@ HamzaZafeer хорошо, если бы я не представил подробностей, мне сказали бы «недостаточно информации» –

ответ

2

Это довольно распространенная проблема, я думаю.То, как я всегда решал подобное, возможно, немного упрощенно, но оно работает и его легко реализовать. Вместо того, чтобы пытаться выяснить, что изменилось (например, удалили 2 менеджера, добавили 1, сохранили 1), а затем просто вставляем/удаляем правильные строки, я всегда делал подход просто удалять все существующие строки, а затем вставлял весь набор от новых, относящихся к данным, которые пользователь вводит.

Итак, в вашем случае, например, пользователь выбирает rep 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, чтобы не застревать с неверной информацией, если во время обработки возникла ошибка.

+0

Ничего себе, я даже не думал об этом как о опции! Это так умно и сокращает количество кода/работы. Большое вам спасибо за эту идею, я точно знаю, куда идти отсюда. Ответ на вопрос и UpVote для вас, мой друг. –

+0

Счастливые помочь. Удачи! – ADyson

Смежные вопросы