2014-11-12 2 views
0

При использовании php app/console doctrine: schema: update -force появляется следующая ошибка.Обработка ошибок сопоставления ассоциации symfony2

[Doctrine\DBAL\DBALException]             
    An exception occurred while executing 'ALTER TABLE profiles ADD CONSTRAINT 
    FK_8B30853036802B0F FOREIGN KEY (participantid) REFERENCES participants (id 
)':                   
    SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
    a child row: a foreign key constraint fails (`smartplan_dev`.`#sql-518_60`, 
    CONSTRAINT `FK_8B30853036802B0F` FOREIGN KEY (`participantid`) REFERENCES 
    `participants` (`id`))

[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update
a child row: a foreign key constraint fails (smartplan_dev.#sql-518_60,
CONSTRAINT FK_8B30853036802B0F FOREIGN KEY (participantid) REFERENCES
participants (id))

Возникает ли эта ошибка, если есть один случай, когда отображение не удается? Я вижу, что это проблематично, так как моим клиентам нравится редактировать напрямую с помощью mysql workbench. Есть ли способ просто пропустить строки, которые выходят из строя, и не прерывать все обновление.

Вот мои данные сущности, о которых идет речь. (профили частично выполнены).

 
namespace classes\classBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* profiles 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class profiles 
{ 
    /** 
    * 
    * @ORM\ManyToOne(targetEntity="participants", inversedBy="profiles") 
    * @ORM\JoinColumn(name="participantid", referencedColumnName="id") 
    */ 
    public $participant;//participant variable 
    /** 
    * @ORM\OneToMany(targetEntity="profilesBeneficiaries", mappedBy="profile") 
    * 
    */ 
    public $beneficiaries;//beneficiaries array variable 
    public $contributions; //contributions variable 
    public $investments; //investments array variable 
    public $retirementNeeds; //retirementNeeds variable 
    public $riskProfile;//riskProfile variable 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="participantid", type="integer") 
    */ 
    public $participantid; 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="userid", type="integer") 
    */ 
    public $userid; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="planid", type="integer") 
    */ 
    public $planid; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="planName", type="string", length=255) 
    */ 
    public $planName; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="currentBalance", type="float",length = 255) 
    */ 
    public $currentBalance; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="beneficiaryStatus", type="text",length = 65535) 
    */ 
    public $beneficiaryStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="investmentsStatus", type="text",length = 65535) 
    */ 
    public $investmentsStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="realignmentStatus", type="text",length = 65535) 
    */ 
    public $realignmentStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="contributionsStatus", type="text",length = 65535) 
    */ 
    public $contributionsStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="catchupContributionStatus", type="text",length = 65535) 
    */ 
    public $catchupContributionStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="annualSalary", type="float",length = 255) 
    */ 
    public $annualSalary; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="retireAge", type="integer") 
    */ 
    public $retireAge; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="preTaxSavingRate", type="float",length = 255) 
    */ 
    public $preTaxSavingRate; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="postTaxSavingRate", type="float",length = 255) 
    */ 
    public $postTaxSavingRate; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="rothTaxSavingRate", type="float",length = 255) 
    */ 
    public $rothTaxSavingRate; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="mStarContribution", type="text",length = 65535) 
    */ 
    public $mStarContribution; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="mStarStatus", type="text",length = 65535) 
    */ 
    public $mStarStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="smart401kStatus", type="text",length = 65535) 
    */ 
    public $smart401kStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="reportDate", type="datetime") 
    */ 
    public $reportDate; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="profileId", type="string", length = 50) 
    */ 
    public $profileId; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="acceptedAdvice", type="text",length = 65535) 
    */ 
    public $acceptedAdvice; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="ACAOptOutStatus", type="text",length = 65535) 
    */ 
    public $ACAOptOutStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="profilestatus", type="smallint") 
    */ 
    public $profilestatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="availability", type="string",length = 250) 
    */ 
    public $availability; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="clientCalling", type="string",length = 50) 
    */ 
    public $clientCalling; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="mstarQuit", type="smallint") 
    */ 
    public $mstarQuit; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="rkdData", type="text",length = 65535) 
    */ 
    public $rkdData; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="welcomeVideo", type="string",length = 63) 
    */ 
    public $welcomeVideo; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="planBasicVideo", type="string",length = 127) 
    */ 
    public $planBasicVideo; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="uniqid", type="string",length = 63) 
    */ 
    public $uniqid; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="migration", type="smallint") 
    */ 
    public $migration; 
} 
 
namespace classes\classBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* participants 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class participants 
{ 

    /** 
    * @ORM\OneToMany(targetEntity="profiles", mappedBy="participant") 
    * 
    */ 
    public $profiles;//array of profiles 


    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="firstName", type="blob", length = 127) 
    */ 
    public $firstName; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="lastName", type="blob", length = 127) 
    */ 
    public $lastName; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="legalName", type="blob", length = 255) 
    */ 
    public $legalName; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="address", type="blob", length = 255) 
    */ 
    public $address; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="city", type="string", length = 50) 
    */ 
    public $city; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="state", type="string", length = 50) 
    */ 
    public $state; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="zip", type="string", length = 10) 
    */ 
    public $zip; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="maritalStatus", type="blob", length = 63) 
    */ 
    public $maritalStatus; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="employmentDate", type="blob", length = 127) 
    */ 
    public $employmentDate; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="birthDate", type="blob", length = 127) 
    */ 
    public $birthDate; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="employeeId", type="blob", length = 255) 
    */ 
    public $employeeId; 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="blob", length = 255) 
    */ 
    public $email; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="phone", type="string",length = 50) 
    */ 
    public $phone; 
} 

ответ

2

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

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

Смежные вопросы