2012-12-26 28 views
0

它是通過主鍵獲取實體嗎?還是僅從具有指定編號的表中獲取實體?

如果我這樣做像水木清華

$model = new Phalcon\Mvc\Model(); 
$model->findFirst('id = 1'); 

很明顯。但如果我定義

$model->findFirst(1); 

它應該返回什麼?主鍵=「1」的實體還是表中的第一個實體?我問,因爲我已經在我的團隊的代碼的方法,例如

class BaseModel extends \Phalcon\Mvc\Model 
{ 
    public function getById($id) { /* ... */ } 
} 

發現,我不知道我們是否真的需要它們。第二個問題 - 如果我們執行findFirst($ int),並且它通過主鍵返回實體,它是否正確地轉義了?

P.S.根據https://github.com/phalcon/cphalcon/issues/265它應該通過主鍵返回實體,對吧?

+0

您可以實例化Phalcon \ Mvc \ Model? – twistedxtra

+0

我寫了新的Phalcon \ Mvc \ Model()作爲例子,我總是使用定義方法的擴展類getSource()等,如果它是你的問題:) – avasin

回答

4

如果你只傳遞一個整數,以FindFirst方法將檢查映射模型只有一個主鍵字段,然後它會執行這樣的查詢:什麼是一樣的

Products::findFirst(1); //SELECT * FROM products WHERE id = 1 

:如果第一個參數是一個整數的有效值,安全的方式與外部的數據要做到這一點

Products::findFirst("id = 1"); 

的(INT)參數只:

Products::findFirst([ 
    "id = ?0", 
    "bind" => [$externalId] 
]); 
1

的FindFirst(55)將返回主鍵的第一個記錄首次發現場等於與55 雖然我不認爲這是一個很好的IDEEA,當你有2個或多個字段作爲主鍵,因爲這可以用於它將LIMIT 1添加到實際查詢中,因爲使用find(55)不會。

與我曾經相信的相反,它不使用主鍵索引順序來「選擇」 第一個使用的字段。它使用在表中找到字段的順序。

所以,如果你有一個表:

CREATE TABLE `T` (
    `A` TINYINT(1) NOT NULL, 
    `B` VARCHAR(50) NOT NULL, 
    PRIMARY KEY (`A`, `B`) 
); 

的FindFirst(66)會產生這個查詢:

SELECT ... WHERE `T`.`B` = 66 LIMIT 1 

如果你想確認,使用事件管理記錄的準確查詢。 (​​)

而且使用FindFirst($ VAR)將無法逃脫$ VAR,因此,如果以某種方式$ VAR = 「55 OR 1 = 1」 的實際查詢將是:SELECT (...),其中55或1 = 1 LIMIT 1

相關問題