我很难找到解决这个问题的方法: 我有两个班级联系和电话有很多关系。电话表有2个字段:countryCode和number。我想检查2个联系人是否没有相同的电话号码,因此验证了2个字段的组合。最后一个代码是这个,但我尝试了很多可能性。
/**
* Contact
*
* @ORM\Table(
* name="contact"
* )
* @ORM\Entity(repositoryClass="EPI\PlatformBundle\Repository\ContactRepository")
*
* @UniqueEntity(fields={"email"}, message="ce mail existe déjà")
* @UniqueEntity(fields={"phoneNumbers"}, message="this phone number already exists")
*
*/
class Contact
{
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* One User can have several Phonenumbers.
* @ORM\ManyToMany(targetEntity="Phone", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinTable(name="contact_phones",
* joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id", onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(name="phone_id", referencedColumnName="id", unique=true, onDelete="CASCADE")}
* )
*/
/**
* Phone
*
* @ORM\Table(name="phone")
* @ORM\Entity(repositoryClass="EPI\PlatformBundle\Repository\PhoneRepository")
*
*/
class Phone
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="country_code", type="string", length=4)
*/
private $countryCode;
/**
* @var string
*
* @ORM\Column(name="phone_nb", type="string", length=9)
*/
private $phoneNb;
class ContactType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', ChoiceType::class, array(
'choices' => array(
'Madame' => 'Madame',
'Monsieur' => 'Monsieur'
)
))
->add('firstName', TextType::class)
->add('surname', TextType::class)
->add('email', EmailType::class)
->add('phoneNumbers', CollectionType::class, array(
'entry_type' => PhoneType::class,
'entry_options' => array('label' => false),
'allow_add' => 'true',
'allow_delete' => 'true',
'error_bubbling' => 'true'
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'EPI\PlatformBundle\Entity\Contact',
));
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'contact';
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'contact';
}
}
使用此代码,我收到以下错误:
An exception occurred while executing 'SELECT t0.id AS id_1, t0.title AS title_2, t0.first_name AS first_name_3, t0.surname AS surname_4, t0.email AS email_5 FROM contact t0 WHERE contact_phones.phone_id = ?' with params [{}]:
SQLSTATE[42S22]: Column not found: 1054 Champ 'contact_phones.phone_id' inconnu dans where clause
感谢您的帮助。
答案 0 :(得分:0)
我终于找到了解决方案,联系人实体中的“uniqueEntity”注释不是正确的工作方式,这个注释必须放在手机实体中,但必须添加“@Assert \ Valid()”注释在指向联系人实体内的电话对象的集合引用之上。 为了更清楚,这是代码:
class Contact
{
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* One Contact can have Many Addresses.
* @ORM\ManyToMany(targetEntity="Address", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinTable(name="contact_addresses",
* joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id", onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id", unique=true, onDelete="CASCADE")}
* )
*/
private $addresses;
/**
* One User can have several Phonenumbers.
* @ORM\ManyToMany(targetEntity="Phone", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinTable(name="contact_phones",
* joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id", onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(name="phone_id", referencedColumnName="id", unique=true, onDelete="CASCADE")}
* )
*
* @Assert\Valid()
*
*/
private $phoneNumbers;
<?php
namespace EPI\PlatformBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\ Validator\Constraints\UniqueEntity;
/**
* Phone
*
* @ORM\Table(name="phone")
* @ORM\Entity(repositoryClass="EPI\PlatformBundle\Repository\PhoneRepository")
*
*
* @UniqueEntity(fields={"countryCode","phoneNb"}, message="ce numéro de téléphone existe déjà")
*/
class Phone
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="country_code", type="string", length=4)
*/
private $countryCode;
/**
* @var string
*
* @ORM\Column(name="phone_nb", type="string", length=9)
*/
private $phoneNb;
@Assert \ Valid()注释是要求Symfony强制验证私有$ phoneNb变量引用的“子对象”的方法。