假设我有这样一个简单的对象:
class User
{
public id;
public name;
public surname;
public gender;
public age;
}
在我的代码中,我想根据设置的属性为这样的对象创建动态UPDATE语句。因此,我希望我的UPDATE(传输到数据库),并只更改已更改的列。如果用户的某个属性未设置,则该属性不应作为数据库列包含在UPDATE语句中。
例如,如果我创建User
对象并仅设置id
、name
和surname
(age
和gender
保持未设置)
$User=new User();
$User->id=1;
$User->name='Bob';
$User->surname='Geldof';
从这个对象,我的代码应该像这样创建UPDATE语句:
UPDATE users SET name='Bob',surname='Geldof' WHERE id=1
问题是当数据库中的列可以有NULL值时(例如age
)。在这种情况下,我应该能够在数据库中空此列。我应该检查User对象属性是否显式设置为NULL。如果它被设置为NULL,那么UPDATE语句的结果应该是:
UPDATE users SET name='Bob',age=NULL WHERE id=1
但是没有办法测试属性是否被设置为NULL值!
在这种情况下,我将属性设置为'NULL'字符串,并在代码中解析它,以便在创建UPDATE语句时将'NULL'字符串转换为NULL值。
是否可以区分对象属性是否显式设置为NULL值(而不是“NULL”字符串)?
3条答案
按热度按时间eqqqjvef1#
我不知道我是不是漏掉了什么,但你要的答案似乎很简单。
NULL
:然而,关于你的文章的其余部分,这似乎毫无意义,因为你可能只是省略了你没有的值,并使用数据库的默认null选项(除非你的特定数据库出于某种原因不支持)。
x9ybnkn62#
如果属性设置为NULL或未设置,isset()没有区别。
使用PHP函数property_exists($user,age)
参见:https://www.php.net/manual/en/function.property-exists.php
neekobn83#
你正在处理你的类声明的属性,所以答案是“否”。
当你声明类属性而没有像这里一样用默认值初始化它们时,PHP对待它们,在类的任何对象上,就像它们是用值
NULL
声明的一样。没有办法区分。最简单的解决方案是在SQL
UPDATE
语句中包含所有属性,包括未更改的null。无论通过省略它们可以节省多少性能,都不值得每次都像这样手动构建查询。