Учение о том, как проверить, существует ли запись при добавлении элемента - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть таблица штатов / регионов, в которой есть 2 поля: штат и страна, где страна является ссылкой на объект страны в таблице стран:

/**
 * @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. Есть два поля для штата / региона: поле выбора, заполненное при выборе страны с известными штатами (например, США, Австралия, Великобритания)- не во всех странах есть государства, поэтому есть также текстовое поле для ввода региона для страны без штатов
  3. Когда состояние сохранено, контроллер должен проверить, существует ли состояние с таким именем И страна уже существует- если да, то это ошибка, у вас не может быть одинаковых имен штатов с одной и той же страной

Если сохранено новое состояние, я проверяю этосостояние новое или существующее, а если новое, то я проверяю, существует ли другое состояние с тем же именем и идентификатором страны:

!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))

, он проверяет, существует ли это существующее состояниеЕсли да, тогда он проверяет, что я изменил его имя, затем он проверяет, существует ли другой с тем же именем и идентификатором страны - и это не работает, я не могу понять логику правильно.Это работает, только если страна не меняется.Но если я отредактирую штат, я, возможно, захочу изменить и его страну.Но приведенный выше код сохраняет состояние с тем же именем и тем же идентификатором страны, что и у уже существующего.

Вот 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();
    }
}

Действительно будетценим вашу помощь с последней логикой, чтобы сохранить отредактированное состояние, чтобы убедиться, что оно еще не существует.

...