我有两个彼此有关系的模型。在一个特定的方法中我需要在另一个上选择一个字段,我通常创建一个方法来拉一个字段,如果将来的字段发生变化,我将只需要更改函数的返回..这里是示例
我目前使用以下内容:(这只是一个示例,显然还有更多字段可供使用)
用户模型
function getUsername($user_id){
$this->id = $user_id;
return $this->field('my_username_field');
}
服务器型号
function getUserIdByServerId($server_id){
$this->id = $server_id;
return $this->field('my_user_id_field');
}
function getUsernameByServerId($server_id){
$user_id = $this->getUserIdByServerId($server_id);
return $this->User->getUsername($user_id);
}
这是要写的很多代码,因为如果我想获得更多字段,我将不得不为每个字段编写一种方法..如果我不这样做,那么当字段名称改变时我会'我必须在所有电话上重写他的名字..更好的方法是什么?
答案 0 :(得分:1)
为什么要获取单个字段?特别是如果你需要不止一个?这没有多大意义。获取整个记录(所有字段,或选择所需的3-4)更有效,然后处理数据而不是对数据库进行多次查询。这是低效和重复的,不是很干。
CakePHP已经有一个方法,Model::field()。
$this->Server->User->field('username', array(
'conditions' => array(
'User.server_id' => $serverId
)
));
但就像我说的那样,你为什么不这样做呢?
$this->Server->find('first', array(
'contain' => array(
'User'
),
'conditions' => array(
'User.server_id' => $serverId
)
));
答案 1 :(得分:0)
您不需要在模型中为此创建新方法。我想你现在在服务器控制器中做的事情是这样的:
$this->Server->id = $server_id;
$username = $this->Server->getUsernameByServerId($this->Server->id);
我认为你可以做的只是打电话:
$this->Server->id = $server_id;
$username = $this->Server->User->field('username');
或者如果您(我认为)PHP 5.4或更高版本只使用:
$this->Server->id = $server_id;
$username = $this->Server->read()['User']['username'];
(使用PHP <5.4,您可以将最后一行拆分为两个)。
我认为你不应该在模型中复制和粘贴大量方法。