学说在添加项目时如何检查记录是否存在

时间:2018-12-17 11:40:52

标签: doctrine-orm concrete5

我有一个州/地区表,其中有两个字段:省和国家/地区,其中国家/地区是国家/地区表中对国家对象的引用:

/**
 * @ORM\Entity
 * @ORM\Table(name="LocationStates")
 */
class LocationState
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $state_id;

    public function getStateID()
    {
        return $this->state_id;
    }

    public function setStateID($state_id)
    {
        $this->state_id = $state_id;
    }

    /**
     * Many States have one Country
     * @ORM\ManyToOne(targetEntity="LocationCountry")
     * @ORM\JoinColumn(name="country",referencedColumnName="country_id",onDelete="SET NULL")
     */
    protected $country;

    public function getCountry()
    {
        return $this->country;
    }

    public function setCountry($country)
    {
        $this->country = $country;
    }

我只有一个页面和一个控制器,用户可以在其中添加新状态或编辑现有状态。

各州有以下条件:

  1. 国家/地区是从一组给定的国家/地区(网站引擎的一部分)中选择的,如果没有选定的国家/地区,则无法保存州/地区
  2. 州/地区有2个字段:在选择具有已知州(例如美国,澳大利亚,英国)的国家时填充的选择框-并非所有国家都有州,因此也有一个文本框可输入没有国家的国家
  3. 保存状态后,控制器应检查是否存在具有相同名称和国家/地区的州-如果是,则错误,您不能使用具有相同国家/地区的相同州名

如果保存了一个新州,我会检查此州是新州还是现有州,如果是新州,那么我会检查是否存在另一个具有相同名称和国家/地区ID的州

!is_object(LocationState::getByID($state_id)) && !empty(LocationState::getByState($state, $country_id))

到目前为止,效果很好。但是,当我编辑并保存现有状态并且无法弄清楚逻辑应该是什么时,问题就开始了。

如果我这样做:

is_object(LocationState::getByID($state_id)) && LocationState::getByID($state_id)->getState() != $state && !empty(LocationState::getByState($state, $country_id))

它检查它是否处于现有状态,如果是,则检查我是否更改了名称,然后它检查是否存在另一个具有相同名称和国家/地区ID的状态-这不起作用,我无法理解正确的逻辑。仅在国家不变的情况下有效。但是,如果我编辑州,我可能也想更改其国家。但是上面的代码用与已经存在的州相同的名称和国家ID保存了该州。

这是getByState(),它是LocationState类的一部分:

public static function getByState($state, $country = null)
{
    $em = \ORM::entityManager();
    if (is_null($country)) {
        return $em->getRepository(get_class())->findOneBy(array('state' => $state));
    }
    else {
        $qb = $em->createQueryBuilder();
        return $qb->select('c')
            ->from('LocationState', 'c')
            ->leftJoin('c.country', 'j', 'WITH', 'j.country_id = c.country')
            ->andWhere('j.country_id = ?1')->setParameter(1, $country)
            ->andWhere('c.state = ?2')->setParameter(2, $state)
            ->getQuery()
            ->getResult();
    }
}

非常感谢您提供的最后逻辑来保存已编辑状态,以确保它不存在。

0 个答案:

没有答案