php - 教义:如何在持久化数据时跳过空/空列
问题描述
我确实有这样的存储库
/**
* @ORM\Entity()
* @ORM\Table(name="user_data")App\Models
*/
class UserData{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*/
protected $email;
/**
* @ORM\Column(type="string", length=255, options={"default":""})
*/
protected $telephone = '';
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}
/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
}
/**
* @return mixed
*/
public function getTelephone()
{
return $this->telephone;
}
/**
* @param mixed $telephone
*/
public function setTelephone($telephone)
{
$this->telephone = $telephone;
}
}
我确实有这个代码部分来创建一个用户
$user = new UserData();
$user->setEmail( $user_data['email'] );
App::DB()->persist($user);
App::DB()->flush();
其中 App::DB() 包含我的 enitymanager
如果我执行上面的代码,我会收到以下错误
An exception occurred while executing 'INSERT INTO user_data (email, telephone) VALUES (?, ?)' with params ["qwe@qwe.qwe", null]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'telephone' cannot be null
我知道,我可以为受保护的 $telephone 设置一个默认值,但是我如何告诉学说要么使用 ORM\Column 中的默认值,要么更好地忽略查询构建过程中的“空”字段?
解决方案
介绍
我之前遇到过几乎类似的问题,我能够使用Lifecycle Callbacks解决我的问题。由于我对 Symfony 不是很有经验,我将首先解释我的问题和我的解决方案,然后在这个答案中处理你的问题。
我的问题
我有一个NewsletterItem
实体,我需要hash
为它创建一个依赖于的实体,因此我需要在创建记录后id
设置 的值。hash
我知道您需要在创建记录之前执行某些操作,但请耐心等待几分钟,我认为这将是您度过的一段美好时光,因为当我看到之前的一些经验时,我会很高兴在你的情况下,有一个几乎类似的问题。
我的解决方案
我一直在使用
Doctrine\ORM\Mapping as ORM
:use Doctrine\ORM\Mapping as ORM;
我指定实体具有生命周期回调:
/** * ... * @ORM\HasLifecycleCallbacks */
class NewsletterItem implements \Serializable {
我已经确保我有一个初始化的方法
hash
:
private function calculateHash()
{
//Here I set the hash based on id, among others and return it
}
- 我实现
setHash
并确保在创建实体后调用它:
/**
* Set hash
*
* @ORM\PostPersist
* @return NewsletterItem
*/
public function setHash()
{
$this->calculateHash();
return $this;
}
- 我清除了应用程序的缓存
然后一切都像魅力一样
您的解决方案
/**
* @ORM\Entity()
* @ORM\Table(name="user_data")App\Models
* @ORM\HasLifecycleCallbacks
*/
class UserData{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*/
protected $email;
/**
* @ORM\Column(type="string", length=255, options={"default":""})
*/
protected $telephone = '';
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return mixed
*/
public function getEmail()
{
return $this->email;
}
/**
* @param mixed $email
*/
public function setEmail($email)
{
$this->email = $email;
}
/**
* @return mixed
*/
public function getTelephone()
{
return $this->telephone;
}
/**
* @ORM\PrePersist
* @param mixed $telephone
*/
public function setTelephone($telephone)
{
$this->telephone = ($telephone ? $telephone : '');
}
}
我从未尝试过我对您的建议,所以如果它不起作用,那么您可能需要一种initializeTelephone
专门用于此目的的方法。
推荐阅读
- javascript - 如何将传单地图中的响应式图像与 css 对齐
- jquery - 如何使用 Coin Slider 获取图像以形成幻灯片?
- python - Pandas:在遍历行时有条件地将行插入 DataFrame
- google-maps - Polymer 3 - 谷歌地图文件丢失
- html - 我想制作一个同时返回文本和图像的服务器,只使用python套接字而不使用simplehttpserver之类的模块
- javascript - Vue中如何动态生成div?
- java - 使用 Retrofit 时,由于输入结束,没有要映射的内容
- java - Android 媒体提供程序没有获取最近添加的图像
- ios - 如何使用 IBInspectable 来控制子视图的属性?
- javascript - jQuery ajax 请求在控制台中成功,但未调用回调