- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
对于 Symfony2 项目,我必须在博客文章和所谓的平台之间建立关系。平台根据您用于查看站点的域定义特定过滤器。例如:如果您通过 url first-example.com 加入该站点,该站点将仅提供连接到该特定平台的博客文章。
为此,我创建了两个实体 Post 和 Platform。之后我用多对多关系将它们映射在一起。我正在尝试通过这种多对多关系从 Doctrines 的 EntityRepository
中的内置函数 findBy()
检索数据。
// 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));
其中 $postRepo
是 Post
实体的正确存储库,$platform
是现有的 Platform
对象。
无论哪种方式:我最终都会收到以下错误:
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
是否可以通过这种方式检索多对多关系中的相关实体,或者我是否被迫自己编写这些函数?奇怪的是:Doctrine 不会抛出任何错误,如:“这是不可能的。”,而是一个内部的 E_NOTICE
。这就是为什么我倾向于认为它应该是可能的,但我在这里遗漏了一些要点。
剥离到有趣的部分,这两个实体看起来像这样。
<?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();
}
}
当然还有 composer.json 文件(以及相关行)
{
[...]
"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",
[...]
},
[...]
}
最佳答案
另一种方式,可能有点 OO/cleaner 而不使用 ID:
public function getPosts(Platform $platform)
{
$qb = $this->createQueryBuilder("p")
->where(':platform MEMBER OF p.platforms')
->setParameters(array('platform' => $platform))
;
return $qb->getQuery()->getResult();
}
更好的方法名称是 findPostsByPlatform
关于php - 在多对多关系中使用 EntityRepository::findBy() 将导致 Doctrine 中的 E_NOTICE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343533/
我需要在分页器中显示表中的数据,同时获取子表中记录的计数。有太多子记录无法加载到内存中并进行计数,因此我想修改在我的 EntityRepository 中构建查询的方式。 理想情况下,我不想重新实现寻
当使用 Doctrine2 时 EntityRepository::findBy()我还需要转义我传入的值吗? $em->getRepository('User')->findBy(array('na
我遇到了这个问题我有一个在所有存储库中重复的方法,例如这个方法。 function getAllOrderedBy($column) { $qb = $this->createQueryBui
我在 symfony 框架的上下文中提问。 我想知道这是否是使用魔法查找方法(如 find($id)、findByField($value) 等...)的好习惯。 那些方法既没有返回类型也没有定义。这
为什么我需要在我的存储库中扩展 ServiceEntityRepository? 在 Symfony 3.4 中,我总是扩展 EntityRepository。使用 ServiceEntityRepo
有没有一种方法可以根据特定条件对 Doctrine 2 EntityRepository 对象进行排序,或者如果我想传递特定的排序参数,是否必须使用 DQL 查询? 最佳答案 您可以通过将第二个参数传
有没有一种方法可以根据特定条件对 Doctrine 2 EntityRepository 对象进行排序,或者如果我想传递特定的排序参数,是否必须使用 DQL 查询? 最佳答案 您可以通过将第二个参数传
我在 parameters.ini 中设置了一个变量,但现在我想从 EntityRepository 中检索该变量,而 $this->container 未设置,所以我不能这样做 我应该如何到达容器?
我想知道在 EntityRepository 类中注入(inject) EventDispatcher 的最佳实践是什么。 最佳答案 首先,使用 global 是一个 very bad practic
namespace griffin\UserBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryC
对于 Symfony2 项目,我必须在博客文章和所谓的平台之间建立关系。平台根据您用于查看站点的域定义特定过滤器。例如:如果您通过 url first-example.com 加入该站点,该站点将仅提
我正在尝试创建服务: groupRepository = $groupRepository; // $this->groupUserRepository = $groupUserRep
我正在尝试使用 FOSOAuthServerBundle 在我的实际 symfony2 项目中实现 OAuth2。 我一直在关注这个Article来实现它。 由于我不使用 FOS 用户 bundle
我是一名优秀的程序员,十分优秀!