Join 原则:两个连接到同一个表

Join 原则:两个连接到同一个表,join,doctrine-orm,Join,Doctrine Orm,我有一个字符表,它有一个ID和一个名称字段 身份证名称 1甘道夫 2佛罗多 3咕噜 4 Samwise 我有一个Matches表,它有一个ID、character1\u ID和character2\u ID字段 id char1 char2 1 1 3 2 2 4 我正在尝试编写一个查询,该查询将连接这些名称,并根据匹配表提取名称 第一场比赛是甘道夫和咕噜 第二场比赛是佛罗多和桑怀斯 这是我的YAML ORM\Dynasties2\Matches: type:

我有一个字符表,它有一个ID和一个名称字段

身份证名称 1甘道夫 2佛罗多 3咕噜 4 Samwise

我有一个Matches表,它有一个ID、character1\u ID和character2\u ID字段

id char1 char2
1    1     3
2    2     4
我正在尝试编写一个查询,该查询将连接这些名称,并根据匹配表提取名称

第一场比赛是甘道夫和咕噜 第二场比赛是佛罗多和桑怀斯

这是我的YAML

ORM\Dynasties2\Matches:
  type: entity
  table: proposals
  fields:
    id:
      type: integer
      id: true
      generator:
        strategy: AUTO
    manyToOne:
      character1:
        targetEntity: ORM\Dynasties2\Characters
      character2:
        targetEntity: ORM\Dynasties2\Characters
但是我没有机会给它写信或阅读

我尝试过这个查询,并用几种不同的方法对其进行了调整,但没有成功

$query = $this -> doctrine -> em -> createQuery ("SELECT a, b, c
        FROM ORM\Dynasties2\Matches a 
        JOIN a.character1 b
        JOIN a.character2 c

        ");
当我尝试写入实体时,如

$new_match = new ORM\Dynasties2\Matches;
$new_match->setCharacter1($character1);
$new_match->setCharacter2($character2);
我会遇到如下错误:

消息:spl\u对象\u哈希期望参数1为对象,字符串给定 消息:get_类希望参数1是对象,字符串给定

消息:传递给ORM\Dynasties2\Propositions::setCharacter1的参数1必须是ORM\Dynasties2\Characters的实例,字符串给定

当我尝试解析和显示查询数据时,我得到:

消息:ORM\Dynasties2\字符类的对象无法转换为字符串

我倒了很多酒,但不是我遗漏了什么,就是我不理解什么

使用CodeIgniter2,但我认为这与此无关

编辑:

这是我的名字

namespace ORM\Dynasties2;

use Doctrine\ORM\Mapping as ORM;

/**
 * ORM\Dynasties2\Matches
 */
class Matches
{
    /**
     * @var integer $id
     */
    private $id;

    /**
     * @var ORM\Dynasties2\Characters
     */
    private $character1;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }


    /**
     * Set character1
     *
     * @param ORM\Dynasties2\Characters $character1
     * @return Proposals
     */
    public function setCharacter1(\ORM\Dynasties2\Characters $character1 = null)
    {
        $this->character1 = $character1;
        return $this;
    }

    /**
     * Get character1
     *
     * @return ORM\Dynasties2\Characters 
     */
    public function getCharacter1()
    {
        return $this->character1;
    }
    /**
     * @var ORM\Dynasties2\Characters
     */
    private $character2;


    /**
     * Set character2
     *
     * @param ORM\Dynasties2\Characters $character2
     * @return Proposals
     */
    public function setCharacter2(\ORM\Dynasties2\Characters $character2 = null)
    {
        $this->character2 = $character2;
        return $this;
    }

    /**
     * Get character2
     *
     * @return ORM\Dynasties2\Characters 
     */
    public function getCharacter2()
    {
        return $this->character2;
    }
}
和字符:

namespace ORM\Dynasties2;

use Doctrine\ORM\Mapping as ORM;

/**
 * ORM\Dynasties2\Characters
 */
class Characters
{
    /**
     * @var integer $id
     */
    private $id;

    /**
     * @var string $name
     */
    private $name;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Characters
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }
编辑:更多错误输出

为了测试查询,我手动将一些数据插入到Matches表中

我得到以下错误:

遇到一个PHP错误

严重程度:4096

消息:找不到ORM\Dynasties2\字符类的对象 转换为字符串

文件名:family/display_view.php

电话号码:23

以下是该视图文件:

foreach ($data as $key => $row) {

$char1 = $row -> getCharacter1();
$char2 = $row -> getCharacter2();
//$target_turn = $row -> getTargetTurn();

echo "</br>You have proposed a match between " . $char1 . " and " . $char2 . ".</br>";
}
第23行是“回声”

当我尝试使用setter写入实体/表时,我得到以下结果:

遇到一个PHP错误

严重程度:4096

消息:参数1传递给 ORM\Dynasties2\Propositions::setCharacter1必须是的实例 ORM\Dynasties2\字符,给定字符串,在中调用 /path/applicationFolder/models/display\u family\u model.php 在第76行并定义

文件名:Dynasties2/Matches.php

行号:255

这是模型的第76行

$char1 = $_SESSION["data_char1"];
$new_proposal->setCharacter1($char1);  // <-- line 76
这是第255行的匹配项

public function setCharacter1(\ORM\Dynasties2\Characters $character1 = null) // <-- line 255
    {
        $this->character1 = $character1;
        return $this;
    }
遇到一个PHP错误

严重程度:4096

消息:参数1传递给 ORM\Dynasties2\Propositions::setCharacter2必须是的实例 ORM\Dynasties2\字符,给定字符串,在中调用 /路径2/applicationFolder/models/display\u family\u model.php 在第77行,定义了

文件名:Dynasties2/Matches.php

电话号码:282

遇到一个PHP错误

严重性:警告

消息:spl\u对象\u哈希期望参数1为对象,字符串 给定

文件名:ORM/UnitOfWork.php

电话号码:1318

遇到一个PHP错误

严重性:警告

消息:spl\u对象\u哈希期望参数1为对象,字符串 给定

文件名:ORM/UnitOfWork.php

电话号码:734

遇到一个PHP错误

严重性:警告

消息:get_类希望参数1是对象,字符串给定

文件名:ORM/UnitOfWork.php

电话号码:738

致命错误:未捕获的异常“条令\ORM\orException”与 消息“”在关联上找到类型为的实体 ORM\Dynasties2\Matchescharacter1,但应为 中的ORM\Dynasties2\字符 /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php:737 堆栈跟踪:0 /路径/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php639: 条令\ORM\UnitOfWork->ComputeAsociationChangesArray,“5”1 /路径/应用程序文件夹/库/条令/ORM/UnitOfWork.php376: 条令\ORM\UnitOfWork->computeChangeSetObjectDoctrine\ORM\Mapping\ClassMetadata, ObjectORM\Dynasties2\Propositions 2 /路径/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php661: 条令\ORM\UnitOfWork->ComputeScheduleInsertSchengeSets 3 /路径/应用程序文件夹/库/条令/ORM/UnitOfWork.php270: 中的条令\ORM\UnitOf /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php 在线737


我认为问题在于,条令不知道将字符连接到匹配的列。列character1\u id和character2\u id需要声明为连接列,因为条令将自动假定一个外键,目标实体ORM\Dynasties2\字符作为字符\u id

尝试将以下内容添加到YAML中

ORM\Dynasties2\Matches:
  type: entity
  table: proposals
  fields:
id:
  type: integer
  id: true
  generator:
    strategy: AUTO
manyToOne:
  character1:
    targetEntity: ORM\Dynasties2\Characters
    joinColumn:
        name: character1_id
        referenceColumnName: id
  character2:
     targetEntity: ORM\Dynasties2\Characters
     joinColumn:
        name: character2_id
        referenceColumnName: id

我认为问题在于,条令不知道将字符连接到匹配的列。列character1\u id和character2\u id需要声明为连接列,因为条令将自动假定具有目标实体O的外键 RM\Dynasties2\字符作为字符\u id

尝试将以下内容添加到YAML中

ORM\Dynasties2\Matches:
  type: entity
  table: proposals
  fields:
id:
  type: integer
  id: true
  generator:
    strategy: AUTO
manyToOne:
  character1:
    targetEntity: ORM\Dynasties2\Characters
    joinColumn:
        name: character1_id
        referenceColumnName: id
  character2:
     targetEntity: ORM\Dynasties2\Characters
     joinColumn:
        name: character2_id
        referenceColumnName: id

你能发布你的角色和匹配的实体类吗?一个通知的堆栈跟踪会很酷的。这将有助于理解问题发生的时间您是指var_dumpdebug_backtrace还是默认错误消息中更具体的信息?回溯是堆积如山的数据..嗯,堆栈跟踪会很有用,但我也发现您的YAML有问题。您是否验证了映射?为什么字符1和字符2的缩进不正确?我不知道堆栈跟踪是什么。我使用CLI从YAML生成实体。这似乎是一个输入错误,我会纠正的。你能发布你的角色并匹配实体类吗?一个通知的堆栈跟踪会很酷。这将有助于理解问题发生的时间您是指var_dumpdebug_backtrace还是默认错误消息中更具体的信息?回溯是堆积如山的数据..嗯,堆栈跟踪会很有用,但我也发现您的YAML有问题。您是否验证了映射?为什么字符1和字符2的缩进不正确?我不知道堆栈跟踪是什么。我使用CLI从YAML生成实体。这似乎是个打字错误,我会纠正的。嗯,我不认为是这个。显示即使没有这些添加的列,代码也将默认为这些值。@jeremy使用最新的文档;嗯,我想不是这样的。显示即使没有这些添加的列,代码也将默认为这些值。@jeremy使用最新的文档;