代码之家  ›  专栏  ›  技术社区  ›  Boris Guéry

如何更新关系表?

  •  0
  • Boris Guéry  · 技术社区  · 15 年前

    我有三张桌子。

    用户(id、邮件、用户名等)

    做法(id、姓名)

    最后一个是关系表,它是n-n。

    这意味着,他可能想添加或删除他的一些做法。

    我可以用什么算法来做这个?

    让这个作业(如果有办法)进入数据库引擎是否更好? 或者我应该编写自己的算法来处理数据,然后对数据库执行请求吗?

    要明确的是:

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

    也许,用户会尝试将其练习从21改为15,但希望保持练习18。

    因此,从请求中,我将得到practices=array(15,18);

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

    我应该选择&检查每个练习,然后根据需要删除?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Peter Bailey    15 年前

    假设您有InnoDB表,将其作为事务处理。

    这里的基本思想是擦干净板岩,然后创建/重新创建关联。这比确定每个更新的增量(即,单独检查每一行并确定它是插入、更新还是删除操作)更容易。

    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;
    
        2
  •  1
  •   Steven Mercatante Dimitri Kopriwa    15 年前
        3
  •  1
  •   Bill Karwin    15 年前

    如果您直接使用 Zend_Db 适配器,您可以构建一个 UPDATE

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

    这将改变 practiceId 到15只在哪一排 实习医生 她21岁。在其他行上,它不会更改 实习医生

        4
  •  0
  •   gnarf    15 年前

    <select> 元素如下所示:

    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