检查实体关系是否确实存在.(教义)



我有关系:

/**
 * @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;
  }
}

相关内容

  • 没有找到相关文章