【问题标题】:One get method for each table field (model)每个表字段(模型)的一种获取方法
【发布时间】:2014-05-09 20:40:24
【问题描述】:

我有两个相互关联的模型。在一个特定的方法中我需要在另一个上选择一个字段,我通常创建一个方法来只提取一个字段,如果将来该字段发生变化,我将只需要更改函数的返回 .. 这里是示例

我目前使用以下:(这只是一个例子,显然还有更多的字段要获取)

用户模型

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

要编写很多代码,因为如果我想获得更多字段,我将不得不为每个字段编写一种方法。如果我不这样做,那么当字段名称更改时,我将拥有在所有电话中重写他的名字.. 有什么更好的方法?

【问题讨论】:

  • 看看php.net/manual/en/language.oop5.overloading.php。顺便说一句,我不是CakePHP用户,可能有框架特定的方式。
  • 有,但是如果我更改字段名称怎么办?我每次调用都得改,不是更容易为每个字段设置一个方法吗?
  • 所以任何一种方式都是正确的?最好是复制和粘贴每个字段还是一个函数?我只会有胖类(模型),但维护更容易
  • 说真的,哪个天才对鼓励复制和粘贴代码的非常糟糕做法的评论投了赞成票?可惜我不能投票给 cmets。

标签: php mysql cakephp


【解决方案1】:

您不需要为此在模型中创建新方法。我猜你现在在你的服务器控制器中要做的事情是这样的:

$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

我认为您不必为此在模型中复制和粘贴大量方法。

【讨论】:

  • 好的,但是字段名称更改呢?我应该在每次调用它时更改它,对吗?但如果这是正确的事情,我会做的。
  • 好吧,只是从数组的不同索引返回值。 Cake 已经在模型上提供了用于查找数据库的方法,因此您应该始终能够使用 read()find() 在 Controller 中获取您想要的内容,并且在模型中创建不同的方法对于此来说只是矫枉过正。
【解决方案2】:

为什么要获取单个字段?特别是如果你需要不止一个?这没有多大意义。获取整条记录(所有字段,或者选择你需要的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
    )
));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 2023-04-07
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多