2010-10-25 77 views
0

我想通過find(all)接收模型數據,但用戶應該只能獲得一組受限制的表字段。這很簡單:如何在find字段列表中包含find()中的關聯

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id' 
))); 

但這種模式(員工模型)也有一個屬於關聯關聯關係:

var $belongsTo = array(
    'Address' => array(
     'className' => 'Address', 
     'foreignKey' => 'address_id', 
     'fields' => array('Address.full_name') 
    ) 
); 

我想Address.full_name實地出現在我取得的數據了。這個嘗試時(在「字段列表」未知列「Address.full_name」 SQL錯誤:1054):

'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)' 
); 

那麼接下來的問題是:是它是一個CakePHP的bug,它不能在提供給find()的字段列表中包含(外國模型)的虛擬字段?

+0

我會把所有'字段'放在find()調用中。 – bancer 2010-10-25 11:39:48

+1

我寧願認爲我的地址屬於我,而不是相反。 ;-) – 2010-10-25 12:05:29

+0

@bancer Sry,我不明白你的意思。 @Daniel是的,可能在RL中,但不在我的應用程序中:P – joni 2010-10-25 12:13:04

回答

1

不幸的是,你不能按你想要的方式使用虛擬域。從Limitations of Virtual Fields蛋糕文檔中:

The implementation of virtualFields in 1.3 has a few limitations. First you cannot use virtualFields on associated models for conditions, order, or fields arrays. Doing so will generally result in an SQL error as the fields are not replaced by the ORM. This is because it difficult to estimate the depth at which an associated model might be found.

它看起來像你必須使用中容納的行爲。

+0

冒着社論的風險,我發現這種事情在Cake中非常普遍。他們將實現看起來像一個非常整潔的功能,但然後對其使用進行嚴格的限制,以至於任何複雜的應用程序都無法使用它們。 – 2010-10-25 14:07:47

+0

我在這裏分享您的想法......看起來,我沒有比「靜態」使用可容忍行爲更多的選擇。任何想法如何做到這一點?如果可能的話,我不想每次都手工調用contains(),但正如我試過的,beforeFInd()回調函數中的contains()不起作用。 – joni 2010-10-25 14:16:43

+0

我會嘗試使用這裏的食譜http://book.cakephp.org/view/1608/Virtual-fields#Limitations-of-virtualFields-1642 – joni 2010-10-25 14:22:39

0

在這種情況下,我會使用Containable行爲。

確保你有你的員工的模型首次加載中可容納的行爲:

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/Containable

+0

我之前使用過可容忍的行爲,直到我意識到這是不必要的,因爲我需要每個控制器操作中包含的數據。我不是每次調用find()或paginate()調用之前的可容納行爲,而是通過靜態設置模型中的關係並設置model-> recursive = 0來做到「經典」方式。 ,它應該沒有太多的遏制行爲。另外,我之前已經有了與包含行爲相同的問題,所以將containsable和find('all',array('fields'=> ..))組合起來也不起作用。 – joni 2010-10-25 09:18:09

+0

你有遞歸設置爲-1之前?這將解釋你的問題,因爲Cake的ORM在該模式下不執行任何JOIN,因此在構建數據源查詢時不會解析belongsTo關聯。 – 2010-10-25 12:03:48

+0

遺憾的是,這不是問題,因爲var'$ recursive = 1;'已經在我的模型中設置。 – joni 2010-10-25 12:18:49

0

SQL Error: 1054: Unknown column 'Address.full_name' in 'field list')

這個錯誤給你一些線索,一些你的專欄名稱電話(可能是fullname而不是full_name),或者更可能是你的模型定義。員工屬於某個地址,但該地址是否有一個或有多個員工?

+0

'Address.full_name'是正確的字段名稱。當我在字段列表中省略它時,沒有SQL錯誤,但相關的地址數據不會被獲取。你確定有必要在被引用的模型中有一個hasMany/One(這種情況下的地址)?因爲沒有'fields'參數,發現('all)取回相關數據沒有問題。 – joni 2010-10-25 12:25:31