Как определить, какие свойства из класса должны быть включены в динамический запрос UPDATE?

Рисунок 1: Вот пример класса Model

class Games {
public $id = 0;
public $date = null;
public $player1_id = 0;
public $player2_id = 0;
public $score = null;

public function save(){
if(empty($this->id)){
// do INSERT here
}
else{
// do UPDATE here
}
}
}

Рисунок 2: Вот пример использования класса

// Save a new date to an existing game
$game = new Games;
$game->id = $input['id'];
$game->date = $input['date'];
$game->save();

Если UPDATE запрос выполняется на основе фигура 2, тогда значения для player1_id, player2_id, а также score будет неправильно перезаписан нулями / нулями. Следовательно, Мне нужен способ определить изнутри класса, что определенные свойства не были установлены от звонка в фигура 2, так что я могу динамически изменять UPDATE запросить обновление только определенных полей в базе данных. Или я подхожу к этому неправильно?

Примечание: я знаю, что мог бы использовать один array свойство для хранения всех полей (и использовать isset), но кажется, что это нарушает точку модели и также очень специфично для PHP (в том смысле, что решение не переносится на другие языки, такие как JAVA, где массивы строго типизированы?). Я также понимаю, что могу сделать то, что, как мне кажется, ORM и сделать начальный SELECT запрос, прежде чем я выполню обновление (но это кажется очень неэффективным!)

0

Решение

  1. объявить постоянную константу. Попробуйте установить для него новый экземпляр созданного вами объекта, скажем, новый MyPristine.
  2. В конструкторе вашей игры установите для всех полей эту константу. Это уловка, чтобы пометить их как «нетронутые». Вы можете использовать Reflection (например, ReflectionClass ($ game) -> getProperties ()), чтобы просмотреть все из них
  3. Перед сохранением повторите цикл по полям и проверьте их значение с помощью PRISTINE. Если он другой, его нужно изменить.

Это решение предполагает, что никто / ничто другое не изменит экземпляры Game между шагами 2 и 3. Именно поэтому большинство ORM делают SELECT заранее.

0

Другие решения

Выберите свой объект перед обновлением. Таким образом, ваш оператор UPDATE будет содержать все поля.

Кроме того, это позволит вам проверить, что идентификатор существует.

0

В противном случае в простом SQL вы можете сделать:

UPDATE games SET date = "2015-01-26", anotherField = $game->anotherField() WHERE id = $game->id;

Примечание: это псевдокод. Используйте подготовленные заявления: http://php.net/manual/en/pdo.prepared-statements.php

Отражение документа: http://php.net/manual/en/book.reflection.php

0
По вопросам рекламы [email protected]