0

私はcakephpの初心者です。テーブル自体を参照する外部キーを持つ InnoDB テーブル CompetitionRegions を使用して、mysql データベースを設計しました。外部キー制約が設定されています。

自己結合テーブルのエイリアスが最初のエイリアスと同じであるため、cake bake はこのための適切なコードを自動的に生成できませんでした。

SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1066 一意でないテーブル/エイリアス: 'CompetitionRegions'

SELECT CompetitionRegions.id AS `CompetitionRegions__id`, CompetitionRegions.name AS `CompetitionRegions__name`, CompetitionRegions.parent_competition_region_id AS `CompetitionRegions__parent_competition_region_id` FROM competition_regions CompetitionRegions LEFT JOIN competition_regions CompetitionRegions ON CompetitionRegions.id = (CompetitionRegions.parent_competition_region_id) LIMIT 20 OFFSET 0

これを解決するにはどうすればよいですか?

class CompetitionRegionsTable::initialize には以下が含まれます:

$this->belongsTo('CompetitionRegions', [
        'foreignKey' => 'parent_competition_region_id'
    ]);

自己結合サブクエリに使用するエイリアスを指定する方法はありますか?

4

2 に答える 2

1

最初の引数はエイリアスとして使用されるため、それを変更する必要があります。CakePHP が引き続きCompetitionRegionsTableクラスを使用するには、オプションで指定する必要がありclassNameます。

$this->belongsTo('ParentCompetitionRegions', [
    'className' => 'CompetitionRegions',
    // the foreign key options isn't actually necessary with a matching alias
    'foreignKey' => 'parent_competition_region_id'
]);

クックブック > データベース アクセスと ORM > アソシエーション > テーブルのリンクも参照してください。

[...] このように、classNameキーを指定することで、同じテーブルを別のアソシエーションとして使用することができます。親子関係を作成するために自己関連付けられたテーブルを作成することもできます [...]

于 2015-12-11T15:41:42.137 に答える
0

ndm だけで提案されたソリューションでは動作しませんでした。別の問題 (ParentCompetitionRegions アソシエーションが存在しない) が発生します。これは、CakePHP の経験がまったくまたはほとんどないために修正できなかった可能性があります。

さらに調査した結果、外部キーの名前をparent_competition_region_idからparent_idに変更するだけで済みました。どうやらその場合、cake bake はそれが自己参照フィールドであるという考えを得ます。

于 2015-12-13T11:57:26.027 に答える