Doctrine/Symfony将空字符串“翻译”为NULL。

3
所以有一个表单和非必填字段,比如“first_name”。当我将此字段留空时,我会收到错误消息,“Column 'first_name' cannot be null”,因为它确实不能为空。但是为什么Doctrine会将空字符串转换为NULL呢?
但我有两个问题:
1. 是否可以禁用此功能? 2. 您对此有什么看法?直到现在,当表单字段为空时,我通常插入空字符串,而不是NULL。但是...有人告诉我这是我们应该遵循的原则。然而,对我来说,NULL表示“没有值”,而''(空字符串)表示不同的含义——“有一个值,但它是空的”。您怎么看?
PS:如果有影响,我使用的是MySql。
编辑:
有一个类似的问题:Symfony2 forms interpret blank strings as nulls,但也许2016年有新的解决方案?
唯一有效的解决方案是接受的答案中提供的。
或者当你有设置setRecap函数时,你可以检查是否为空并设置你期望的值。
public function setRecap($recap) {
  if(!isset($recap)) {
    $this->recap = ''
  } else {
    $this->recap = $recap;
  }
}

但是我有很多这样的字段,这似乎有些过度,必须有一个更简单的解决方案。
附言:我没有尝试Thomas Decaux在接受的答案下面的答案,因为它对我来说似乎是hacky。
2个回答

2

好的,正如有人建议我的那样,这很简单:

public function setUserName($userName) {
    $this->userName = (string)$userName;
    return $this;
}

在实体中。

编辑:此外,我们需要为变量提供默认值,例如:

$userName = '';

最好是private $userName = '';,或者protected $userName = ''; - cezar

2
坦白地说,最好允许在数据库中使用 NULL 值作为名字的第一个名称。你所做的只会让事情更加复杂。
Symfony 是由专业人员开发的,对我来说这种转换是合理的,因为空字符串并不比 NULL 更有意义。
你上面说的,NULL 和空字符串是两个不同的东西,从某种意义上说是正确的,但是拥有空名称(即空字符串)是什么意思?难道不更好地说这个人没有已知的名字(即 NULL)吗?
编辑:
针对您的第一条评论:
那么,在这种情况下,将其强制转换为字符串是正确的方法。

1
这个观点至少是有争议的,其他人对在数据库中使用NULL值持有强烈的反感,例如:http://www.databasedesign-resource.com/null-values-in-a-database.html,但你也可以找到其他例子。 - Elzo Valugi
@Zephyr 嗯,是的,这个例子不太好,但有时候我想表达的是"我们没有这个信息" == NULL,与"我们有这个信息,但它是空的" == ''(空字符串)相对应。但是+1,因为在"名字"这个例子中你是100%正确的。一个我不想要NULL的例子是地址,比如:Flat 104/B 24, Roberts Street - 这是当某人住在公寓里时,如果他/她不住在公寓里,只有房屋号码。而我希望"flat"列是一个空字符串(我们有这个信息),而不是NULL,因为对我来说,NULL一直表示"我们没有这个信息"。 - konrad_firm
1
这里还有一些链接:https://dba.stackexchange.com/questions/59/when-to-use-null-and-when-to-use-an-empty-string 和 https://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls - Elzo Valugi
1
确实。我的观点是Doctrine不应将空值转换为null,但这只是我个人的意见。 - Elzo Valugi
@ElzoValugi:我理解你的观点,使用IS NULL等语句在我的Doctrine请求中频繁出现,以避免链接中描述的模棱两可。个人而言,我更加钟爱对数据进行精确表示,而非使用数据本身的复杂性,但最终选择一个方案还是因人而异。然而,就我使用Symfony/Doctrine相当长一段时间来说,Symfony/Doctrine团队决定在这种情况下偏向于使用NULL而不是空字符串。我的建议是为了简单起见,跟随框架设定的倾向。 - Zephyr
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接