From 43982b6c3a58fa7b23d350860aea4faaf2e702ba Mon Sep 17 00:00:00 2001 From: Alexander Fuhr Date: Tue, 2 Jun 2015 17:27:36 +0200 Subject: [PATCH] DbObject: fix multicolumn primary keys --- library/Director/Data/Db/DbObject.php | 40 +++++++++++++++++++-------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/library/Director/Data/Db/DbObject.php b/library/Director/Data/Db/DbObject.php index 2f4ed816..283f4bd9 100644 --- a/library/Director/Data/Db/DbObject.php +++ b/library/Director/Data/Db/DbObject.php @@ -426,9 +426,20 @@ abstract class DbObject public function getId() { // TODO: Doesn't work for array() / multicol key - if (isset($this->properties[$this->keyName])) - { - return $this->properties[$this->keyName]; + if (is_array($this->keyName)) { + $id = array(); + foreach ($this->keyName as $key) { + if (! isset($this->properties[$key])) { + return null; // Really? + } + $id[$key] = $this->properties[$key]; + } + return $id; + } else { + if (isset($this->properties[$this->keyName])) + { + return $this->properties[$this->keyName]; + } } return null; } @@ -633,8 +644,8 @@ abstract class DbObject { $keyname = $this->getKeyName(); if (is_array($keyname)) { - foreach ($keyname as $idx => $k) { - $this->set($k, $key[$idx]); + foreach ($keyname as $k) { + $this->set($k, $key[$k]); } } else { $this->set($keyname, $key); @@ -653,13 +664,20 @@ abstract class DbObject protected function createWhere() { $key = $this->getKeyName(); - if (is_array($key) && ! is_empty($key)) { + if (is_array($key) && ! empty($key)) { $where = array(); - foreach($key as $k) { - $where[] = $this->db->quoteInto( - sprintf('%s = ?', $k), - $this->properties[$k] - ); + foreach ($key as $k) { + if ($this->hasBeenLoadedFromDb()) { + $where[] = $this->db->quoteInto( + sprintf('%s = ?', $k), + $this->loadedProperties[$k] + ); + } else { + $where[] = $this->db->quoteInto( + sprintf('%s = ?', $k), + $this->properties[$k] + ); + } } return implode(' AND ', $where); } else {