สวัสดี ฉันมีการตั้งค่านี้: บ้าน N-1 ผู้ใช้ N-1 กลุ่ม N-N บทบาท
Domain\Entity\House:
manyToOne:
user:
targetEntity: Domain\Entity\User
cascade: ["persist"]
inversedBy: houses
joinColumn:
name: user_id
referencedColumnName: id
onDelete: CASCADE
genre:
targetEntity: Domain\Entity\Genre
cascade: ["persist"]
inversedBy: houses
joinColumn:
name: genre_id
referencedColumnName: id
onDelete: SET NULL
Domain\Entity\User:
oneToMany:
houses:
targetEntity: Domain\Entity\House
cascade: ["persist"]
mappedBy: user
manyToOne:
group:
targetEntity: Domain\Entity\Group
inversedBy: users
Domain\Entity\Group:
manyToMany:
roles:
targetEntity: Domain\Entity\Role
joinTable:
name: groups_roles
joinColumns:
group_id:
referencedColumnName: id
onDelete: CASCADE
inverseJoinColumns:
role_id:
referencedColumnName: id
onDelete: CASCADE
ฉันมีบทบาท กลุ่ม และผู้ใช้มากมายอยู่แล้ว และเมื่อฉันอัปเดตออบเจ็กต์ House ด้วยสิ่งที่ต้องการ:
$userObj = $userRepo->find(3);
$house->setUser($userObj);
$houseRepo->save($house);
ทุกสิ่งระเบิดและหลักคำสอนบอกฉันดังนี้:
พบเอนทิตีใหม่ผ่านความสัมพันธ์ 'ผู้ใช้#กลุ่ม' ที่ไม่ได้กำหนดค่าให้ดำเนินการต่อเนื่องสำหรับเอนทิตี
ดังนั้นฉันจึงแก้ไขการแมปเพื่อให้มีตัวเลือก cascade=["persist"]:
Domain\Entity\House:
manyToOne:
user:
targetEntity: Domain\Entity\User
cascade: ["persist"]
inversedBy: houses
joinColumn:
name: user_id
referencedColumnName: id
onDelete: CASCADE
genre:
targetEntity: Domain\Entity\Genre
cascade: ["persist"]
inversedBy: houses
joinColumn:
name: genre_id
referencedColumnName: id
onDelete: SET NULL
Domain\Entity\User:
oneToMany:
houses:
targetEntity: Domain\Entity\House
cascade: ["persist"]
mappedBy: user
manyToOne:
group:
targetEntity: Domain\Entity\Group
inversedBy: users
cascade: ["persist"]
Domain\Entity\Group:
manyToMany:
roles:
cascade: ["persist"]
targetEntity: Domain\Entity\Role
joinTable:
name: groups_roles
joinColumns:
group_id:
referencedColumnName: id
onDelete: CASCADE
inverseJoinColumns:
role_id:
referencedColumnName: id
onDelete: CASCADE
แต่เมื่อฉันพยายามเรียกใช้โค้ด php ด้านบนเพื่อบันทึกวัตถุ House ที่อัปเดต ฉันได้รับข้อผิดพลาดนี้
มีข้อยกเว้นเกิดขึ้นขณะดำเนินการ 'แทรกบทบาท (รหัส คำอธิบาย) ค่า (?, ?)' ด้วยพารามิเตอร์ ['ROLE_USER', null]: SQLSTATE [23000]: การละเมิดข้อจำกัดด้านความสมบูรณ์: 1062 รายการที่ซ้ำกัน 'ROLE_USER' สำหรับคีย์ 'UNIQ_B63E2EC777153098 '
มีข้อยกเว้นเกิดขึ้นขณะดำเนินการ 'INSERT INTO ประเภท (ชื่อ, ใช้งานอยู่, parent_id) ค่า (?, ?, ?)' ด้วยพารามิเตอร์ [null, 1, null]: SQLSTATE [23000]: การละเมิดข้อ จำกัด ด้านความสมบูรณ์: 1048 คอลัมน์ 'ชื่อ' ไม่สามารถ เป็นโมฆะ
เหตุใดดูเหมือนว่าหลักคำสอนจะไม่รู้ว่าบทบาทที่กำหนดให้กับกลุ่ม ที่กำหนดให้กับผู้ใช้ มีอยู่แล้วในฐานข้อมูลของฉัน ข้อมูลทุกอย่างมีอยู่ในฐานข้อมูลแล้ว
พื้นที่เก็บข้อมูลฐานของฉันใช้รหัสนี้เพื่อบันทึกเอนทิตี:
abstract class AbstractRepository extends EntityRepository
{
/**
* @param $object
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function save($object)
{
$this->getEM()->persist($object);
$this->getEM()->flush();
}
ฉันใช้ repo ฐานนี้ตั้งแต่เดือนกุมภาพันธ์ 2560 เพื่อคงเอนทิตีใหม่และอัปเดตโดยไม่มีปัญหาเลย ฉันไม่เข้าใจพฤติกรรมนี้จริงๆ
สแน็ปช็อตของอินสแตนซ์ออบเจ็กต์ House คุณสามารถดูผู้ใช้และกลุ่มผู้ใช้และบทบาทของกลุ่มได้