find() に fieldlist との関連付けを含める方法
-
26-09-2019 - |
質問
find(all) でモデル データを受信したいのですが、ユーザーは制限されたテーブル フィールドのセットのみを取得する必要があります。それは簡単です:
$ret = $this->find('all',array('fields'=>array(
'Employee.id','Employee.address_id'
)));
ただし、このモデル (従業員モデル) には、belongsTo 関連付けもあります。
var $belongsTo = array(
'Address' => array(
'className' => 'Address',
'foreignKey' => 'address_id',
'fields' => array('Address.full_name')
)
);
欲しいのは Address.full_name
フィールドもフェッチしたデータに表示されます。ただし、上記の find() 呼び出しでは機能せず、エラーがスローされます (SQL エラー:1054:これを試行すると、「フィールド リスト」に不明な列「Address.full_name」があります:
'fields'=>array('Employee.id','Employee.address_id','Address.full_name')
これを解決する方法を知っている人はいますか?
編集: Address.full_name が仮想フィールドであることをすっかり忘れていました。Cakephp が生成した SQL を見ると、それが機能しない理由は明らかです。
SELECT
`Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
`employees` AS `Employee`
LEFT JOIN `addresses` AS `Address`
ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1
アドレス モデルでは、full_name は次のように定義されます。
var $virtualFields = array(
'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
);
それでは、質問は次のとおりです。find() に指定されたフィールドリスト内に (外部モデルの) 仮想フィールドを含めることができないのは、CakePHP のバグですか?
解決
残念ながら、あなたは仮想フィールドにあなたがしたいの方法を使用することはできません。 制限のからのケーキのドキュメントでます:
1.3でvirtualFieldsの実装にはいくつかの制限があります。まず、条件、順序、またはフィールドアレイの関連するモデルにvirtualFieldsを使用することはできません。フィールドがORMで置き換えられていないとしてそうすることで、一般的にSQLエラーになります。それが困難関連するモデルが発見されるかもしれない深さを推定するためです。
あなたが収容可能振る舞いを使用する必要がありますように見えます。
他のヒント
私はこのケースで収容可能の挙動を使用することになります。
を確認してくださいあなたが最初にあなたの従業員モデルにロードされた収容可能振る舞いを持っています:
var $actsAs = array('Containable');
あなたがあなたのデータを取得しようとしているときに、このようにそれを実行します。
$params = array('fields' => array('Employee.id', 'Employee.address_id'),
'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);
ここに収容可能行動の詳細: http://book.cakephp.org/view/1323 /収容可能の
SQLエラー:1054:不明な列 'フィールドリスト' で 'Address.full_name')
このエラーは、何か可能性が高く、あなたのカラム名コール(それはむしろfullname
よりfull_name
することができる)や、お使いのモデルの定義のいずれかで間違っていることを手掛かりを与えます。従業員belongsToのアドレスが、アドレスhaveOneまたはhaveMany従業員がいますか?