คำถามติดแท็ก doctrine-orm

Doctrine ORM เป็น PHP ORM ในขณะที่หลักคำสอน 1.2 ใช้รูปแบบ Active Record Doctrine ORM 2 ขึ้นไปจะใช้รูปแบบ Data Mapper โครงการ Doctrine คือชุดของไลบรารีโอเพ่นซอร์สและเครื่องมือสำหรับจัดการกับสิ่งที่เป็นนามธรรมของฐานข้อมูลและการทำแผนที่เชิงวัตถุเชิงสัมพันธ์ที่เขียนด้วย PHP


14
Doctrine2: วิธีที่ดีที่สุดในการจัดการแบบตัวต่อตัวกับคอลัมน์พิเศษในตารางอ้างอิง
ฉันสงสัยว่าอะไรดีที่สุดสะอาดและเป็นวิธีที่ง่ายที่สุดในการทำงานกับความสัมพันธ์แบบหลายต่อหลายคนใน Doctrine2 สมมติว่าเรามีอัลบั้มอย่างMaster of Puppetsโดย Metallica ที่มีหลายแทร็ก แต่โปรดทราบความจริงที่ว่าหนึ่งแทร็กอาจปรากฏในมากกว่าหนึ่งอัลบั้มเช่นBattery by Metallicaทำ - อัลบั้มที่สามมีเนื้อเรื่องนี้ ดังนั้นสิ่งที่ฉันต้องการคือความสัมพันธ์แบบหลายต่อหลายกลุ่มระหว่างอัลบั้มและแทร็กโดยใช้ตารางที่สามกับคอลัมน์เพิ่มเติมบางอย่าง (เช่นตำแหน่งของแทร็กในอัลบั้มที่ระบุ) ที่จริงฉันต้องใช้ตามเอกสารของ Doctrine แนะนำความสัมพันธ์แบบหนึ่งต่อหลายสองครั้งเพื่อให้บรรลุการทำงานนั้น /** @Entity() */ class Album { /** @Id @Column(type="integer") */ protected $id; /** @Column() */ protected $title; /** @OneToMany(targetEntity="AlbumTrackReference", mappedBy="album") */ protected $tracklist; public function __construct() { $this->tracklist = new \Doctrine\Common\Collections\ArrayCollection(); } public …

2
เมื่อลบน้ำตกด้วยหลักคำสอน 2
ฉันกำลังพยายามทำตัวอย่างง่ายๆเพื่อเรียนรู้วิธีการลบแถวออกจากตารางหลักและลบแถวที่ตรงกันในตารางย่อยโดยใช้ Doctrine2 โดยอัตโนมัติ นี่คือสองหน่วยงานที่ฉันใช้: Child.php: <?php namespace Acme\CascadeBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="child") */ class Child { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\ManyToOne(targetEntity="Father", cascade={"remove"}) * * @ORM\JoinColumns({ * @ORM\JoinColumn(name="father_id", referencedColumnName="id") * }) * * @var father */ private $father; …

10
นับแถวใน Doctrine QueryBuilder
ฉันใช้ QueryBuilder ของ Doctrine เพื่อสร้างแบบสอบถามและฉันต้องการรับจำนวนผลลัพธ์ทั้งหมดจากแบบสอบถาม $repository = $em->getRepository('FooBundle:Foo'); $qb = $repository->createQueryBuilder('n') ->where('n.bar = :bar') ->setParameter('bar', $bar); $query = $qb->getQuery(); //this doesn't work $totalrows = $query->getResult()->count(); ฉันต้องการเรียกใช้การนับในแบบสอบถามนี้เพื่อรับแถวทั้งหมด แต่ไม่ส่งคืนผลลัพธ์ที่แท้จริง (หลังจากคิวรี่การนับนี้ฉันจะแก้ไขเคียวรีเพิ่มเติมด้วย maxResults สำหรับการแบ่งหน้า)


13
วิธีใช้ WHERE IN กับหลักคำสอน 2
ฉันมีรหัสต่อไปนี้ซึ่งทำให้ฉันมีข้อผิดพลาด: Message: Invalid parameter number: number of bound variables does not match number of tokens รหัส: public function getCount($ids, $outcome) { if (!is_array($ids)) { $ids = array($ids); } $qb = $this->getEntityManager()->createQueryBuilder(); $qb->add('select', $qb->expr()->count('r.id')) ->add('from', '\My\Entity\Rating r'); if ($outcome === 'wins') { $qb->add('where', $qb->expr()->in('r.winner', array('?1'))); } if ($outcome === 'fails') { …

5
วิธีการรับอาร์เรย์สเกลาร์มิติเดียวเป็นผลการสืบค้น dql หลักคำสอน?
ฉันต้องการรับอาร์เรย์ของค่าจากคอลัมน์ id ของตารางการประมูล ถ้านี่เป็น SQL ดิบฉันจะเขียน: SELECT id FROM auction แต่เมื่อฉันทำสิ่งนี้ในหลักคำสอนและดำเนินการ: $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); ฉันได้รับอาร์เรย์ดังนี้: array( array('id' => 1), array('id' => 2), ) แต่ฉันต้องการรับอาร์เรย์เช่นนี้: array( 1, 2 ) ฉันจะทำเช่นนั้นโดยใช้หลักคำสอนได้อย่างไร?
116 php  doctrine-orm 

2
พร็อกซีในหลักคำสอน 2 คืออะไร?
ฉันเพิ่งอ่านเอกสารหลักคำสอน 2 ทั้งหมดเสร็จฉันเริ่ม Sandbox ของตัวเองฉันเข้าใจหลักการส่วนใหญ่แล้ว แต่ยังมีคำถามและฉันไม่พบคำอธิบายที่สมบูรณ์ในเอกสาร อะไรคือProxyการเรียน? เมื่อใดที่ฉันควรใช้กับเอนทิตี เท่าที่ฉันเข้าใจคลาสพร็อกซีจะเพิ่มเลเยอร์เพื่อให้คุณสามารถเพิ่มคุณสมบัติอื่น ๆ ให้กับเอนทิตีของคุณได้ แต่ทำไมต้องใช้พร็อกซีแทนที่จะใช้เมธอดในคลาสเอนทิตี

12
วิธีการเรียงลำดับวิธีการของ findAll Doctrine?
ฉันได้อ่านเอกสารของ Doctrine แต่ฉันไม่สามารถหาวิธีจัดเรียงผลลัพธ์ findAll () ได้ ฉันใช้ symfony2 + หลักคำสอนนี่คือคำสั่งที่ฉันใช้ในคอนโทรลเลอร์ของฉัน: $this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll(); แต่ฉันต้องการให้ผลลัพธ์เรียงลำดับตามชื่อผู้ใช้จากน้อยไปมาก ฉันพยายามส่งอาร์เรย์เป็นอาร์กิวเมนต์ด้วยวิธีนี้: findAll( array('username' => 'ASC') ); แต่ไม่ได้ผล (ไม่บ่นเหมือนกัน) มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องสร้างแบบสอบถาม DQL

1
หลักคำสอน 2 ไม่สามารถใช้ nullable = false ในความสัมพันธ์ manyToOne ได้หรือไม่?
Userมีหนึ่งPackageที่เกี่ยวข้องกับมัน ผู้ใช้หลายคนสามารถอ้างถึงแพ็กเกจเดียวกัน Userไม่สามารถดำรงอยู่ได้หากไม่มีการPackageกำหนด Userควรเป็นเจ้าของความสัมพันธ์ ความสัมพันธ์เป็นแบบสองทิศทางดังนั้นจึงPackageมีผู้ใช้เป็นศูนย์หรือมากกว่านั้น ข้อกำหนดเหล่านี้นำไปสู่ManyToOneความสัมพันธ์UserและOneToManyความสัมพันธ์ของPackageหลักคำสอน 2 อย่างไรก็ตามpackage_idในuserตาราง (นั่นคือคีย์ต่างประเทศ) อนุญาตให้มีnullค่า ฉันได้ลองตั้งค่าnullable=falseแต่คำสั่ง: php app/console doctrine:generate:entities DL --path="src" --no-backup บอกว่ามีแอตทริบิวต์ไม่มีสำหรับความสัมพันธ์nullable ฉันขาดอะไรไป?ManyToOne class User { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\ManyToOne(targetEntity="Package", inversedBy="users") */ private $package; } class Package { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") …

4
คีย์เฉพาะหลักคำสอนและคอมโพสิต
ฉันต้องการสร้างคีย์เฉพาะในหลักคำสอน นี่คือฟิลด์ของฉัน: /** * @var string $videoDimension * * @Column(name="video_dimension", type="string", nullable=false) */ private $videoDimension; /** * @var string $videoBitrate * * @Column(name="video_bitrate", type="string", nullable=false) */ private $videoBitrate; ฉันจะแสดงหลักคำสอนได้อย่างไรว่าสิ่งเหล่านั้นรวมกันเป็นกุญแจเฉพาะแบบผสม
105 php  mysql  doctrine-orm 

4
อะไรคือความแตกต่างระหว่าง inversedBy และ mappedBy?
ฉันกำลังพัฒนาแอปพลิเคชันของฉันโดยใช้ Zend Framework 2 และ Doctrine 2 ในขณะที่การเขียนคำอธิบายประกอบผมไม่สามารถที่จะเข้าใจความแตกต่างระหว่างและmappedByinversedBy ฉันควรใช้เมื่อใดmappedBy? ฉันควรใช้เมื่อใดinversedBy? ฉันไม่ควรใช้เมื่อใด นี่คือตัวอย่าง: /** * * @ORM\OneToOne(targetEntity="\custMod\Entity\Person", mappedBy="customer") * @ORM\JoinColumn(name="personID", referencedColumnName="id") */ protected $person; /** * * @ORM\OneToOne(targetEntity="\Auth\Entity\User") * @ORM\JoinColumn(name="userID", referencedColumnName="id") */ protected $user; /** * * @ORM\ManyToOne (targetEntity="\custMod\Entity\Company", inversedBy="customer") * @ORM\JoinColumn (name="companyID", referencedColumnName="id") */ protected $company; ฉันทำการค้นหาอย่างรวดเร็วและพบสิ่งต่อไปนี้ แต่ฉันยังสับสน: ตัวอย่าง 1 …
102 php  doctrine-orm 

7
ตั้งค่า Id ด้วยหลักคำสอนอย่างชัดเจนเมื่อใช้กลยุทธ์ "อัตโนมัติ"
หน่วยงานของฉันใช้คำอธิบายประกอบนี้เพื่อเป็น ID: /** * @orm:Id * @orm:Column(type="integer") * @orm:GeneratedValue(strategy="AUTO") */ protected $id; จากฐานข้อมูลที่สะอาดฉันกำลังนำเข้าในระเบียนที่มีอยู่จากฐานข้อมูลรุ่นเก่าและพยายามเก็บ ID เดียวกันไว้ จากนั้นเมื่อเพิ่มระเบียนใหม่ฉันต้องการให้ MySQL เพิ่มคอลัมน์ ID โดยอัตโนมัติตามปกติ น่าเสียดายที่ดูเหมือนว่า Doctrine2 จะละเว้น ID ที่ระบุโดยสิ้นเชิง โซลูชั่นใหม่ ตามคำแนะนำด้านล่างต่อไปนี้เป็นทางออกที่ต้องการ: $this->em->persist($entity); $metadata = $this->em->getClassMetaData(get_class($entity)); $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE); $metadata->setIdGenerator(new \Doctrine\ORM\Id\AssignedGenerator()); โซลูชันเก่า เนื่องจากหลักคำสอนหมุนออกจาก ClassMetaData เพื่อกำหนดกลยุทธ์ตัวสร้างจึงต้องแก้ไขหลังจากจัดการเอนทิตีใน EntityManager: $this->em->persist($entity); $metadata = $this->em->getClassMetaData(get_class($entity)); $metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE); $this->em->flush(); ฉันเพิ่งทดสอบสิ่งนี้บน MySQL และทำงานได้ตามที่คาดไว้หมายความว่าเอนทิตีที่มี ID ที่กำหนดเองจะถูกเก็บไว้ด้วย …

9
มีข้อมูลมากเกินไปกับ var_dump ใน symfony2 doctrine2
ฉันมีเอนทิตีประมาณ 40 รายการและมีความสัมพันธ์แบบสองทิศทางมากมาย เมื่อใดก็ตามที่ฉันใช้ var_dump ($ user) หรือเอนทิตีใด ๆ ที่เบราว์เซอร์ของฉันโหลดด้วยข้อมูลอาร์เรย์และตัวแปรมากเกินไปมันก็จะพัง ฉันต้องการปัญหาอะไร กำลังแทรกข้อมูลได้ดี ฉันสามารถทำให้เกิดปัญหาในการผลิตได้หรือไม่

12
“ คลาส XXX ไม่ใช่เอนทิตีที่ถูกต้องหรือซุปเปอร์คลาสที่แมป” หลังจากย้ายคลาสในระบบไฟล์
ฉันมีคลาสเอนทิตีใน Aib \ PlatformBundle \ Entity \ User.php ฉันไม่มีปัญหาในการพยายามสร้างคลาสแบบฟอร์มผ่าน php app / console หลักคำสอน: สร้าง: ฟอร์ม AibPlatformBundle: ผู้ใช้ ตอนนี้ฉันได้เปลี่ยนเนมสเปซเป็น Aib \ PlatformBundle \ Entity \ Identity \ User แล้ว แต่เมื่อฉันพยายามสร้างแบบฟอร์มด้วยงานที่ฉันพูดก่อนที่มันจะพูดว่า: "Class Aib \ PlatformBundle \ Entity \ User ไม่ใช่เอนทิตีที่ถูกต้องหรือซูเปอร์คลาสที่แมป" นี่คือเนื้อหาของไฟล์: <?php namespace Aib\PlatformBundle\Entity\Identity; use Doctrine\ORM\Mapping as ORM; /** * Aib\PlatformBundle\Entity\Identity\User …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.