我有关系:
/**
* @ORMOneToOne(targetEntity="ModelEntityImage")
* @ORMJoinColumn(name="image_id", referencedColumnName="id")
*/
protected $image;
和普通getter:
public function getImage()
{
return $this->image;
}
在我的树枝代码中,我称之为:
model.image.getImageURL()
但是,如果数据库中没有关系,例如缺少 image_id ,因此getimage方法将返回null,并且在方法 getimageurl 上进行了例外。我如何避免清晰。
我的解决方案是:
protected function exist($model, $modelName) {
if(isset($model)) {
return $model;
} else {
$modelName = 'ModelEntity\' . $modelName;
return new $modelName();
}
}
和getter喜欢:
public function getImage()
{
return $this->exist($this->image, 'Image');
}
但我不喜欢它,对我来说似乎不是很好的解决方案。我可以做更多的符合方式,我认为我缺少某些东西吗?
您并没有真正缺少任何东西。
您在实体中具有可选关系,这意味着该值可以为null。因此,处理这种情况的"正确"方法是在访问其上的任何方法之前检查属性是否设置。
这意味着在树枝案例中:
{% if model.image is not null %}
{{ model.image.getimageUrl() %}
{% endif %}
,在PHP情况下:
if($model->getImage() !== null) {
$url = $model->getImage()->getImageUrl();
}
其他选项将更改GetImage的实现:
public function getImage() {
return $this->image === null ? new Image() : $this->image;
}
或直接在模型实体中创建专用的getimageurl方法:
public function getImageUrl() {
return $this->image !== null ? $this->image->getImageUrl() : '';
}
无法填补它的唯一原因是它失败或找不到关系。在这种情况下,您的解决方法也将返回null
,因为它不存在。
您可以做的是通过:
检查{% if model.image %}
{{ model.image.imageUrl }}
{% endif %}
它搜索get
方法,因此您可以使用imageUrl
,然后搜索getImageUrl
。
使用关系时也有一件事,Symfony不会有反向关系。我自己找不到这个问题,但是一个与之挣扎的伴侣(他对发展决策充分信任(告诉我,您必须手动添加它,这是Symfony/Doctrine中的已知和故意的事情。
让我给你一个示例OneToMany
示例:
[entity human.php]
class Human
{
/**
* @ORMManyToOne(targetEntity="Race", inversedBy="race")
* @JoinColumn
*
* A human can have one race, but a race can belong to many human
*/
private $race;
// using optional parameter so I can demonstrate it on one way..
// If you want it to be required, remove " = null"
// and also remove "if ($race && ..)"
public function setRace(Race $race = null)
{
$this->race = $race; // default from bin/console doctrine:generate:entities
// Reverse check and add if not automatically done
if ($race && ! $race->getHumans()->contains($this)) {
$race->addHuman($this);
}
return $this; // default from bin/console doctrine:generate:entities
}
}
以及相反的站点:
[entity race.php]
class Race
{
/**
* @ORMOneToMany(targetEntity="Human", mappedBy="race")
*/
private $humans;
public function __construct()
{
$this->humans = new ArrayCollection;
}
public function addHuman(Human $human)
{
$this->humans[] = $human; // default from bin/console doctrine:generate:entities
// Custom reverse check and add
if ($human->getRace() !== $this) {
$human->setRace($this);
}
return $this; // default from bin/console doctrine:generate:entities
}
// also important for remove!
public function removeHuman(Human $human)
{
$this->humans->removeElement($human);
if ($human->getRace() !== null) {
$human->setRace(null);
}
return $this;
}
}