私の質問に対する答えが明らかである場合は、事前にお詫び申し上げます。ここに投稿する前に、このトピックを調査するために十分な注意を払いました.
私のフレームワーク経験のほとんどは CodeIgniter を使用して得たものであるため、ORM を実際に使用した経験はありません。(CI には既製の ORM ソリューションがいくつかありますが、私はそれらを使用したことはありません。)
Laravel の Eloquent ORM に組み込まれている ORM 機能を使用して、クエリの実行時にトーナメント テーブルと国テーブルを自動的に結合し、トーナメント データとそれに関連する国データを含むデータ セットを返したいと考えています。
つまり、Eloquent に外部キーの関係を自動的に認識させて、トーナメントと国のデータのセット全体を返すクエリ (たとえば、Tournament:: with('Country')->all()) を実行できるようにしたいのです。
Eloquent を本来意図されていない方法で使用している場合は、今すぐ止めてください。私の混乱は、構文やコーディングのエラーではなく、受け入れられない解決策をまとめようとしていることにあるのかもしれません。
Eloquent で複製したいクエリ
SELECT * FROM tournaments LEFT JOIN countries ON tournaments.country_id = countries.id
PHP で期待される結果
Tournament オブジェクトの配列を (PHP で) 受け取ることを期待しています。単一の Tournament オブジェクトは次のようになります。
- トーナメント.id
- トーナメント.年
- トーナメント.country_id
- トーナメント.created_at
- トーナメント.updated_at
- 国.id
- 国コード
- 国名
- 国.url
- countries.created_at
- countries.updated_at
これまでに行った失敗した試み
これらすべての試行をダミーのコントローラー メソッドで実行し、結果を書式設定された文字列としてプロファイラーに出力しました。
失敗した試行 #1:
ダミー コントローラの PHP コード:
$tournaments = Tournament::with('Country')->all();
次のクエリを生成します。
SELECT * FROM `tournaments`
試行 #1 の戻り値:
トーナメント テーブルの列のみを含む Tournament オブジェクトを含む配列。
試行失敗 #2
ダミー コントローラの PHP コード:
$tournaments = Tournament::with('Country')->first();
次のエラーが生成されます。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tournament_id' in 'where clause'
SQL: SELECT * FROM `countries` WHERE `tournament_id` IN (?)
Bindings: array (
0 => '1',
)
その他の失敗した試み
命名規則 (列、テーブルなど) のさまざまな組み合わせを試しましたが、役に立ちませんでした。また、Fluent でクエリを作成しようとしましたが、うまくいきましたが、回避しようとしている結合を指定する必要がありました。
私の環境
- PHP: 5.3.13
- MySQL: 5.1.53
- ララベル: 3.2.3
テーブル間の関係
- 一対一の関係
- トーナメントには国が必要です (強制するための外部キー制約があります)
- 国は他の多くの関係に属することができます (たとえば、ここには示されていない参加者は出生国を持っています)。
国表
CREATE TABLE `countries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(4) NOT NULL,
`name` varchar(25) NOT NULL,
`url` varchar(25) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `countries_code_unique` (`code`),
KEY `countries_url_index` (`url`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=latin1
トーナメント表
CREATE TABLE `tournaments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`year` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tournaments_year_unique` (`year`),
KEY `tournaments_country_id_foreign` (`country_id`),
CONSTRAINT `tournaments_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=latin1
国モデル (countries.php)
class Country extends Eloquent {
public static $timestamps = true;
public static $table = 'countries';
}
トーナメント モデル (tournaments.php)
class Tournament extends Eloquent {
public static $timestamps = true;
public function country()
{
return $this->has_one('Country');
}
}