Рисунок 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
запрос, прежде чем я выполню обновление (но это кажется очень неэффективным!)
Это решение предполагает, что никто / ничто другое не изменит экземпляры Game между шагами 2 и 3. Именно поэтому большинство ORM делают SELECT заранее.
Выберите свой объект перед обновлением. Таким образом, ваш оператор UPDATE будет содержать все поля.
Кроме того, это позволит вам проверить, что идентификатор существует.
В противном случае в простом 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