2014-03-30 22 views
0

我有两个模型彼此有关系。在一个特定的方法中,我需要在另一个领域选择一个领域,我通常创建一个方法来拉动一个领域,如果未来的领域发生变化,我将不得不改变函数的返回值。每个表字段(模型)的一个获取方法

我目前使用以下方法:(这只是一个例子,显然还有更多的领域获得)

用户模式

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

看看http://www.php.net/manual/en/language.oop5.overloading.php。顺便说一下,我不是CakePHP用户,可能有特定于框架的方式。 –

+0

有,但如果我更改字段名称呢?我将不得不改变对它的每一个呼叫,为每个字段设置一个方法并不容易? –

+0

所以无论哪种方式是正确的?最好是复制和粘贴或每个单个字段的功能?我只会有脂肪课(模型),但维护更容易 –

回答

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你可以拆分最后一行分成两)。

我不认为你应该在模型中复制和粘贴负载方法。

+0

好的,但是字段名称的改变呢?我应该在每次通话时改变它,对吧?但如果这是正确的事情,我会做。 –

+0

好吧,只需返回数组中不同索引的值即可。Cake已经在查找数据库的模型上有方法,所以你应该总是能够使用'read()'或者'find()'来获得你想要的控制器,并且在模型中创建不同的方法就是为此过度杀伤。 – SharkofMirkwood

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 
    ) 
)); 
相关问题