【问题标题】:Doctrine: two joins to the same table原则:同一张表的两个连接
【发布时间】:2012-05-04 17:10:05
【问题描述】:

我有一个包含 ID 和名称字段的 Characters 表。

身份证号
1 甘道夫
2 佛罗多
3 咕噜
4 山姆维斯

我有一个包含 ID、character1_id 和 character2_id 字段的 Matches 表。

id char1 char2
1    1     3
2    2     4

我正在尝试编写一个查询,该查询将加入这些并根据匹配表提取名称。

第一场比赛是甘道夫和咕噜
第 2 场比赛是佛罗多和山姆怀斯

这是我的 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_object_hash() 期望参数 1 是对象,给定字符串 消息:get_class() 期望参数 1 是对象,给定字符串

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

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

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

我已经倾注了Doctrine query documentation,但要么我遗漏了什么,要么没有理解什么。

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

编辑:

这是我的 Matches 实体

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\Characters 的对象不能是 转成字符串

文件名: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\Proposals::setCharacter1() 必须是 ORM\Dynasties2\Characters,给定字符串,调用 /path/applicationFolder/models/display_family_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\Proposals::setCharacter2() 必须是 ORM\Dynasties2\Characters,给定字符串,调用 /path2/applicationFolder/models/display_family_model.php 在第 77 行并定义

文件名:Dynasties2/Matches.php

行号:282

$char2 = $_SESSION["data_char2"];
$new_proposal->setCharacter2($char2); // <-- line 77

public function setCharacter2(\ORM\Dynasties2\Characters $character2 = null) // <-- line 282
    {
        $this->character2 = $character2;
        return $this;
    }

遇到了 PHP 错误

严重性:警告

消息:spl_object_hash() 期望参数 1 是对象,字符串 给定

文件名:ORM/UnitOfWork.php

行号:1318

遇到了 PHP 错误

严重性:警告

消息:spl_object_hash() 期望参数 1 是对象,字符串 给定

文件名:ORM/UnitOfWork.php

行号:734

遇到了 PHP 错误

严重性:警告

消息:get_class() 期望参数 1 是对象,给定字符串

文件名:ORM/UnitOfWork.php

行号:738

致命错误:未捕获的异常 'Doctrine\ORM\ORMException' 与 message '在关联中找到类型的实体 ORM\Dynasties2\Matches#character1,但期待 ORM\Dynasties2\Characters' in /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php:737 堆栈跟踪:#0 /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(639): Doctrine\ORM\UnitOfWork->computeAssociationChanges(Array, '5') #1 /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(376): Doctrine\ORM\UnitOfWork->computeChangeSet(Object(Doctrine\ORM\Mapping\ClassMetadata), 对象(ORM\Dynasties2\Proposals))#2 /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(661): Doctrine\ORM\UnitOfWork->computeScheduleInsertsChangeSets() #3 /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php(270): Doctrine\ORM\UnitOf 中 /path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork.php 在第 737 行

【问题讨论】:

  • 您能否发布您的 Character 和 Matches 实体类。
  • 通知的堆栈跟踪会很酷。这将有助于了解问题发生的时间
  • 您的意思是 var_dump(debug_backtrace()) 还是默认错误消息中的更具体信息?回溯是一大堆数据..
  • 好吧,堆栈跟踪会很有用,但我也看到您的 YAML 存在问题。您是否验证了您的映射?为什么character1character2 没有正确缩进?
  • 我不知道堆栈跟踪是什么。我使用 CLI 从 YAML 生成我的实体。这似乎是一个错字,我会更正。

标签: join doctrine-orm


【解决方案1】:

我认为问题在于教义不知道将字符连接到哪一列以匹配。列 character1_id 和 character2_id 需要声明为连接列,因为学说会自动假设一个外键,目标实体“ORM\Dynasties2\Characters”作为characters_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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2015-05-18
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多