2

ID と名前フィールドを持つ Characters テーブルがあります。

ID名
1 ガンダルフ
2 フロド
3 ゴラム
4 サムワイズ

ID、character1_id、および character2_id フィールドを持つ Matches テーブルがあります。

id char1 char2
1    1     3
2    2     4

これらを結合し、Matches テーブルに従って名前を取得するクエリを作成しようとしています。

マッチ1はガンダルフとゴラム
マッチ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 クエリ ドキュメントを調べましたが、何かが足りないか、何かを理解できていません。

(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行目は「エコー」です。

セッターを使用してエンティティ/テーブルに書き込もうとすると、次のようになります。

PHP エラーが発生しました

重大度: 4096

メッセージ: ORM\Dynasties2\Proposals::setCharacter1() に渡される引数 1 は、ORM\Dynasties2\Characters のインスタンスでなければなりません。指定された文字列は、76 行目の /path/applicationFolder/models/display_family_model.php で呼び出され、定義されています。

ファイル名: Dynasties2/Matches.php

ライン番号: 255

これがモデルの 76 行目です。

$char1 = $_SESSION["data_char1"];
$new_proposal->setCharacter1($char1);  // <-- line 76

Matches の 255 行目です。

public function setCharacter1(\ORM\Dynasties2\Characters $character1 = null) // <-- line 255
    {
        $this->character1 = $character1;
        return $this;
    }

PHP エラーが発生しました

重大度: 4096

メッセージ: ORM\Dynasties2\Proposals::setCharacter2() に渡される引数 1 は、ORM\Dynasties2\Characters のインスタンスでなければなりません。指定された文字列は、77 行目の /path2/applicationFolder/models/display_family_model.php で呼び出され、定義されています。

ファイル名: 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

致命的なエラー:メッセージ「関連付け ORM\Dynasties2\Matches#character1 のタイプのエンティティが見つかりましたが、/path/applicationFolder/libraries/Doctrine/ORM/UnitOfWork に ORM\Dynasties2\Characters が必要です」というメッセージを含むキャッチされない例外「Doctrine\ORM\ORMException」 .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), Object(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

4

1 に答える 1

0

問題は、ドクトリンがどの列を結合して一致させるかを知らないことだと思います。列 character1_id と character2_id は結合列として宣言する必要があります。doctrine は自動的にターゲット エンティティ "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
于 2012-04-24T09:59:34.307 に答える