Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2 findOneBy方法使用联接继承映射返回null_Php_Inheritance_Symfony_Doctrine Orm - Fatal编程技术网

Php Doctrine2 findOneBy方法使用联接继承映射返回null

Php Doctrine2 findOneBy方法使用联接继承映射返回null,php,inheritance,symfony,doctrine-orm,Php,Inheritance,Symfony,Doctrine Orm,我认为这可能是一个类似的问题,但我还不能发表评论,也不想提供一个非答案来反驳它 我正在制作一个注释Symfony2包,它允许我将注释直接关联到各种不同的实体类型,因此我创建了一个抽象的注释“线程”实体,然后每个可以接收注释的对象类型通过一个具体的线程实体进行扩展 例如,需要对故事实体进行注释,所以我创建了一个具体的故事线程实体,它扩展了线程并指定了一个链接到故事的OneToOne属性。这样我就可以做$storyThread->findOneBy('story',$story)->getComme

我认为这可能是一个类似的问题,但我还不能发表评论,也不想提供一个非答案来反驳它

我正在制作一个注释Symfony2包,它允许我将注释直接关联到各种不同的实体类型,因此我创建了一个抽象的注释“线程”实体,然后每个可以接收注释的对象类型通过一个具体的线程实体进行扩展

例如,需要对故事实体进行注释,所以我创建了一个具体的故事线程实体,它扩展了线程并指定了一个链接到故事的OneToOne属性。这样我就可以做
$storyThread->findOneBy('story',$story)->getComments()。但是,findOneBy始终返回null。当我运行从调试中检索到的原始SQL并填写相关的故事id时,我确实得到了预期的结果

以下是抽象线程实体:

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Joe\Bundle\CommentBundle\Repository\ThreadRepository")
 * @ORM\Table(name="comment_threads")
 * @ORM\MappedSuperClass
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="thread_type", type="string")
 * @ORM\DiscriminatorMap( {"story" = "Joe\Bundle\StoryBundle\Entity\StoryThread"} )
 */
abstract class Thread
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $enabled = true;

    /**
     * @var datetime $createdAt
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="thread_id", cascade={"persist"})
     * @param ArrayCollection $data
     */
    protected $comments;


    function __construct()
    {
        $this->comments = new ArrayCollection();
    }
use Doctrine\ORM\Mapping as ORM;
use Joe\Bundle\CommentBundle\Entity\Thread as AbstractThread;

/**
 * @ORM\Entity(repositoryClass="Joe\Bundle\StoryBundle\Repository\StoryThreadRepository")
 * @ORM\Table(name="story_comment_threads")
 */
class StoryThread extends AbstractThread
{
    /**
     * @ORM\OneToOne(targetEntity="Story")
     * @ORM\JoinColumn(name="story_id", referencedColumnName="id")
     */
    protected $story;

    /**
     * @var datetime $createdAt
     */
    protected $createdAt;


    public function __construct()
    {
        $this->comments = new \Doctrine\Common\Collections\ArrayCollection();
    }
下面是具体的StoryThread实体:

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Joe\Bundle\CommentBundle\Repository\ThreadRepository")
 * @ORM\Table(name="comment_threads")
 * @ORM\MappedSuperClass
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="thread_type", type="string")
 * @ORM\DiscriminatorMap( {"story" = "Joe\Bundle\StoryBundle\Entity\StoryThread"} )
 */
abstract class Thread
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $enabled = true;

    /**
     * @var datetime $createdAt
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="thread_id", cascade={"persist"})
     * @param ArrayCollection $data
     */
    protected $comments;


    function __construct()
    {
        $this->comments = new ArrayCollection();
    }
use Doctrine\ORM\Mapping as ORM;
use Joe\Bundle\CommentBundle\Entity\Thread as AbstractThread;

/**
 * @ORM\Entity(repositoryClass="Joe\Bundle\StoryBundle\Repository\StoryThreadRepository")
 * @ORM\Table(name="story_comment_threads")
 */
class StoryThread extends AbstractThread
{
    /**
     * @ORM\OneToOne(targetEntity="Story")
     * @ORM\JoinColumn(name="story_id", referencedColumnName="id")
     */
    protected $story;

    /**
     * @var datetime $createdAt
     */
    protected $createdAt;


    public function __construct()
    {
        $this->comments = new \Doctrine\Common\Collections\ArrayCollection();
    }
最后,我将尝试从给定的故事实体中检索StoryThread对象:(getThreadEntityName获取完全限定的StoryThread类名,getObjectColumn返回用于将ObjectThread实体映射到其对象的列的名称,因此在本例中为“故事”)

以下是findOneBy方法中生成的SQL:(当我用实际的故事id(如1)替换?时,我得到了预期的单个结果)

选择
t1.id作为id2,
t1.启用为启用3,
t1.在创建时创建,
t0.story_id作为story_id 5,
t1.U型螺纹
从…起
故事\评论\线程t0
t0.id=t1.id上的内部连接注释\u线程t1
哪里
t0.story_id=?


有谁能告诉我,我怎样才能让findOneBy方法发挥作用,或者找到另一种可行的方法?谢谢

我本以为我需要提供对象,因为“story”列引用了一个story实体,但事实证明我只需要使用id:

$thread = $repository->findOneBy(array(
    $repository->getObjectColumn() => $object->getId()
));

我本以为我需要提供对象,因为“story”列引用了一个story实体,但事实证明我只需要使用id:

$thread = $repository->findOneBy(array(
    $repository->getObjectColumn() => $object->getId()
));

您是否尝试过$storyThread->findOneBystory($story)->getComments()??抱歉耽搁了,我直到现在才有机会尝试。这产生了同样的结果。然而,自从昨天发布这篇文章以来,我又多了一天的智慧,这让我尝试使用$object->getId()作为值,这似乎已经成功了!:)您是否尝试过$storyThread->findOneBystory($story)->getComments()??抱歉耽搁了,我直到现在才有机会尝试。这产生了同样的结果。然而,自从昨天发布这篇文章以来,我又多了一天的智慧,这让我尝试使用$object->getId()作为值,这似乎已经成功了!:)