Đối với một dự án Symfony2, tôi phải tạo mối quan hệ giữa một bài đăng trên blog và các nền tảng được gọi là. Nền tảng xác định bộ lọc cụ thể dựa trên tên miền bạn sử dụng để xem trang web. Ví dụ: Nếu bạn tham gia trang web theo url first-example.com, trang web sẽ chỉ cung cấp các bài đăng trên blog, được kết nối với nền tảng cụ thể này.Sử dụng EntityRepository :: findBy() với quan hệ Nhiều-Tới-Nhiều sẽ dẫn đến một E_NOTICE trong Doctrine
Để làm như vậy, tôi đã tạo hai thực thể Bài đăng và Nền tảng. Sau đó tôi lập bản đồ chúng cùng với mối quan hệ Nhiều-Nhiều. Tôi đang cố truy xuất dữ liệu qua mối quan hệ Nhiều-Nhiều này từ hàm dựng sẵn findBy()
trong Doctrines 'EntityRepository
.
// every one of these methods will throw the same error
$posts = $postRepo->findBy(array('platforms' => array($platform)));
$posts = $postRepo->findByPlatforms($platform);
$posts = $postRepo->findByPlatforms(array($platform));
đâu $postRepo
là Repository chính xác cho các Post
thực thể và $platform
một Platform
đối tượng hiện có.
Dù bằng cách nào: Tôi kết thúc nhận được lỗi sau:
ErrorException: Notice: Undefined index: joinColumns in [...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1495
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1495
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1452
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1525
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1018
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:842
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:157
[...]/src/Foobar/BlogBundle/Tests/ORM/PostTest.php:102
Là nó thậm chí có thể lấy entites liên quan trong một Nhiều-To-Nhiều mối quan hệ theo cách này, hoặc là tôi buộc phải viết các chức năng này bởi bản thân mình? Điều kỳ lạ là: Doctrine sẽ không ném bất kỳ lỗi nào như: "Không thể.", Nhưng nội bộ E_NOTICE
. Đó là lý do tại sao tôi nghĩ rằng nó sẽ là có thể, nhưng tôi đang thiếu một số điểm ở đây.
Tước xuống các phần thú vị, hai thực thể trông như thế này.
<?php
namespace Foobar\CommunityBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
// [...] other namespace stuff
/**
* @ORM\Entity(repositoryClass="Foobar\CommunityBundle\Entity\Repository\PlatformRepository")
* @ORM\Table(name="platforms")
*/
class Platform
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
// [...] other field stuff
}
<?php
namespace Foobar\BlogBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
// [...] other namespace stuff
/**
* @ORM\Entity(repositoryClass="Foobar\BlogBundle\Entity\Repository\PostRepository")
* @ORM\Table(name="posts")
*/
class Post implements Likeable, Commentable, Taggable, PlatformAware
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Foobar\CommunityBundle\Entity\Platform", cascade={"persist"})
* @ORM\JoinTable(name="map_post_platform",
* joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="platform_id", referencedColumnName="id")}
* )
*/
protected $platforms;
// [...] other fields
/**
* Constructor
*/
public function __construct()
{
// [...]
$this->platforms = new ArrayCollection();
}
}
Và tất nhiên các tập tin composer.json (cũng lột xuống dòng liên quan)
{
[...]
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.1.*",
"doctrine/orm": ">=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.0.*",
"doctrine/doctrine-fixtures-bundle": "dev-master",
[...]
},
[...]
}
Cảm ơn bạn đã trả lời của bạn. Chỉ cần một chút bổ sung. Phương pháp đầu tiên của bạn là viết một hàm riêng trong một kho lưu trữ tùy chỉnh. Tôi có thể đã thể hiện bản thân mình không rõ ràng nhưng tôi đã cố gắng tìm nạp các thực thể liên quan thông qua hàm 'find *()' được xây dựng sẵn của Doctrine. Phương pháp thứ hai không hoạt động vì tôi có một liên kết đơn hướng. Do đó không có thuộc tính '$ posts' trên' Platform' và do đó, không có getter và setters. Tuy nhiên câu trả lời của bạn sẽ giúp tôi rất nhiều, vì bây giờ tôi chắc chắn hơn rằng không thể chỉ sử dụng các cách tích hợp để có được các liên kết Nhiều-Nhiều-Nhiều được lọc. – devsheeep