我有一个州/地区表,其中有两个字段:省和国家/地区,其中国家/地区是国家/地区表中对国家对象的引用:
/**
* @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;
}
我只有一个页面和一个控制器,用户可以在其中添加新状态或编辑现有状态。
各州有以下条件:
如果保存了一个新州,我会检查此州是新州还是现有州,如果是新州,那么我会检查是否存在另一个具有相同名称和国家/地区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();
}
}
非常感谢您提供的最后逻辑来保存已编辑状态,以确保它不存在。