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