Ilişkisel bir tabloyu güncelleştirmek nasıl?

4 Cevap php

3 tablolar var.

Kullanıcılar (id, mail, kullanıcı adı, vb.)

Uygulamaları (id, isim)

UsersPractices (kullanıcı kimliği, practiceId)

Son nn ilişkisel tablodur.

Ben kullanıcının isteğine bağlı olarak, bu bir güncellemek istiyorum.

O bazıları onun uygulamaları eklemek veya kaldırmak istediğiniz verebilecek, gelir.

Ne algoritması ben bunu yapmak için kullanabilirsiniz?

Should it be better to let this job (if there is a way) to the database engine ? Or should i write my own algorithm to handle the data, then do my requests to the db ?

EDIT:

Temiz olması için:

___________________________
| UserId    |  PracticeId |
|-----------|-------------|
|    12     |     21      |
|-----------|-------------|
|    12     |     18      |
|-----------|-------------|

Belki, kullanıcı 21-15 yaptığı uygulama değiştirmeye çalışıyorum ama uygulama 18 tutmak istiyor edecektir.

Yani, isteğin, ben uygulamalar = array (15,18) alırsınız;

bu kullanıcıların uygulama gibi bakmak anlamına gelir:

___________________________
| UserId    |  PracticeId |
|-----------|-------------|
|    12     |     15      |
|-----------|-------------|
|    12     |     18      |
|-----------|-------------|

SO Bunu başarmak için en iyi yolu nedir?

I seçin ve Gerekenler Her uygulama kontrol ve gerekirse daha sonra, silmek?

Hepsini sil ve haber ekleyin.

4 Cevap

Bir işlem olarak, sen InnoDB tablolar var varsayarsak.

Burada temel fikir temiz kayrak silin ve sonra oluşturmak / dernekler oluşturmak yeniden etmektir. Bu (yani tek tek her satır teftiş ve bir INSERT, UPDATE veya DELETE olmadığını belirleme) Her güncellemenin delta belirlenmesi daha kolaydır.

Burada kullanmak istiyorsunuz ham SQL bulunuyor

BEGIN;

DELETE FROM UsersPractices
 WHERE userId = [User ID];

INSERT INTO UsersPractices (
       userId
     , practiceId)
VALUES ([User ID], [Practice ID 1])
     , ([User ID], [Practice ID 2])
     ...
     , ([User ID], [Practice ID N]);

COMMIT;

Doktrini Çıkış (http://www.doctrine-project.org/). PHP için bir nesne ilişkisel Eşleştiricisi (ORM) çerçevesi bulunuyor. Bu kolayca başarmak istediğinizi işleyebilir.

Doğrudan Zend_Db adaptörü kullanarak, SQL ifadeleri yürütme ediyorsanız, kullanıcı yapmak istediği seçimlere göre bir UPDATE sorgusu oluşturmak olabilir. Örneğin:

$db->query('UPDATE UsersPractices
    SET practiceId = 
      CASE practiceId
       WHEN 21 THEN 15
       ELSE practiceId 
      END
    WHERE userId = ?', 
  array($userId));

Bu practiceId sadece practiceId 21'dir satırda 15 değiştirmek istiyorsunuz. Diğer satırları yandan, practiceId kolona herhangi bir değişiklik yapmak istiyorum.

Eh - Ben bu tür bir şey işlemek için düşünebildiğim en kolay yolu böyle bir <select> eleman şey inşa etmek olacaktır:

function getUserPractices($userId) {
  $data = array();
  $result = mysql_query("SELECT Practices.* FROM UsersPractices LEFT JOIN Practices on UsersPractices.practiceId = Practices.id WHERE userId = '".mysql_real_escape($userId)."'");
  while ($row = mysql_fetch_array($result)) { 
    $data[$row['id']] = $row['name'];
  }
  return $data;
}

// assuming $user is your user row...
$user_practices = getUserPractices($user['id']);
$result = mysql_query("SELECT * FROM Practices ORDER BY name");
echo "<select multiple='multiple' name='practices[]'>";
while ($row = mysql_fetch_assoc($result)) {
  echo "<option value='".$row['id']."'";
  if (isset($user_practices[$row["id"]])) echo " selected='selected'";
  echo ">".htmlentities($row['name'])."</option>";
}
echo "</select>";

// This should result in an array $_POST['practices'] that contains practiceId's
// will come back to write more about actually inserting the change into the db
// but simplest way is to delete all of them based on userId then insert the new ones