หลักคำสอนต้องการคงอยู่ซึ่งเอนทิตีที่เกี่ยวข้องที่ได้รับการจัดการแล้ว

สวัสดี ฉันมีการตั้งค่านี้: บ้าน 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 คุณสามารถดูผู้ใช้และกลุ่มผู้ใช้และบทบาทของกลุ่มได้

ป้อนคำอธิบายรูปภาพที่นี่


person Matt    schedule 26.10.2018    source แหล่งที่มา
comment
คุณสามารถดูจากที่นี่และเปรียบเทียบ ralation และวิธีการที่คุณควรมีและทุกอย่างควรใช้งานได้ -› stackoverflow.com/questions/49026436/relationships-in-doctrine/   -  person l13    schedule 26.10.2018
comment
โชคไม่ดี.. ถ้าฉันใส่รหัสลงใน Fixture และใช้ ObjectManager ที่ฝังอยู่ใน Fixture เอนทิตีจะถูกบันทึกไว้ ไม่เข้าใจว่าปัญหาคืออะไร ทุกอย่างทำงานได้จนถึงสัปดาห์ที่แล้ว   -  person Matt    schedule 31.10.2018