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