需要在cakePHP中使用全名

需要在cakePHP中使用全名,cakephp,function,string,dry,Cakephp,Function,String,Dry,如果我有一个名为的人名模型和名为的人名模型,我如何创建和显示全名?我想在我的编辑和查看视图(即“编辑Frank Luke”)顶部和其他位置显示它。简单地将回声放在名字和姓氏上是不容易的 如果这是一个非常简单的问题,我很抱歉,但是还没有任何结果 谢谢,, 弗兰克·卢克 为清晰起见进行编辑:好的,我在人物模型上有一个函数 function full_name() { return $this->Person->first_name . ' ' . $this->Person

如果我有一个名为
的人名模型
和名为
的人名模型
,我如何创建和显示
全名
?我想在我的编辑和查看视图(即“编辑Frank Luke”)顶部和其他位置显示它。简单地将回声放在
名字和
姓氏上是不容易的

如果这是一个非常简单的问题,我很抱歉,但是还没有任何结果

谢谢,, 弗兰克·卢克

为清晰起见进行编辑:好的,我在人物模型上有一个函数

function full_name() {
    return $this->Person->first_name . ' ' . $this->Person->last_name;
}
在视图中,我调用

echo $person['Person']['full_name']

这给了我一个通知,我有一个未定义的索引。从视图调用函数的正确方法是什么?是否必须在控制器或其他地方执行此操作?

您可能需要获取从数据库返回的两个字段,并将它们连接到一个字符串变量中,然后才能显示

save()方法设置的数组只返回数据库中的字段,它们不调用模型函数。要正确使用上述功能(位于您的模型中),您需要添加以下内容:

到控制器,在$action方法中:

$this->set( 'fullname', $this->Person->full_name();
// must have $this-Person->id set, or redefine the method to include $person_id
他认为,

echo $fullname;

基本上,您需要使用控制器从模型中收集数据,并将其分配给控制器。这与您之前的过程相同,您可以将find()调用返回的数据分配给视图中的变量,只是从不同的来源获取数据。

如果您只想显示全名,而不需要执行任何数据库操作(比较、查找),我认为您应该在视图中连接字段

这将更符合MVC设计模式。在您的示例中,您只希望以不同的方式查看数据库中的信息

由于级联操作很简单,因此将其放在单独的函数中可能不会节省太多代码。我认为只在视图文件中执行最简单的操作


如果您想做更多有趣的事情(如更改大写字母,将链接返回给用户),我建议您创建一个使用用户数据调用的元素。

您必须使用afterFind回调。

有多种方法可以做到这一点。一种方法是在模型类中使用afterFind函数。 请参阅:

但是,这个函数不能很好地处理嵌套数据,相反,它不能处理所有嵌套数据! 因此,我在app_模型中使用afterfind函数遍历结果集

function afterFind($results, $primary=false){
    $name = isset($this->alias) ? $this->alias : $this->name;
    // see if the model wants to attach attributes
    if (method_exists($this, '_attachAttributes')){
        // check if array is not multidimensional by checking the key 'id'
        if (isset($results['id'])) {
            $results = $this->_attachAttributes($results);
        } else {
            // we want each row to have an array of required attributes
            for ($i = 0; $i < sizeof($results); $i++) {
                // check if this is a model, or if it is an array of models
                if (isset($results[$i][$name]) ){
                    // this is the model we want, see if it's a single or array
                    if (isset($results[$i][$name][0]) ){
                        // run on every model
                        for ($j = 0; $j < sizeof($results[$i][$name]); $j++) {
                            $results[$i][$name][$j] = $this->_attachAttributes($results[$i][$name][$j]);
                        }
                    } else {
                        $results[$i][$name] = $this->_attachAttributes($results[$i][$name]);
                    }
                } else {
                    if (isset($results[$i]['id'])) {
                        $results[$i] = $this->_attachAttributes($results[$i]);
                    }
                }
            }
        }
    }
    return $results;
} 
此方法可以处理嵌套的模型数据,例如,Person有许多帖子,那么此方法还可以在帖子模型中附加属性

此方法还应记住,由于使用了别名,而不仅仅是名称(即类名),具有类名以外其他名称的链接模型是固定的。

阅读第一个,了解如何使用'fields'键,即find('all',array('fields'=>array())将CONCAT传递给CakePHP查询生成器

第二个链接向您展示了如何将使用自定义字段返回的数字索引合并到返回结果中的适当位置


这当然应该放在一个模型函数中,然后从那里调用。

这就是我一直在尝试的。我可以把函数做得很好。它的调用让我无所适从。我应该更清楚。这涵盖了需求。我继续了元素。
function _attachAttributes($data) {
    if (isset($data['first_name']) && isset($data['last_name'])) {
        $data['full_name'] = sprintf("%s %s %s", $data['first_name'], $data['last_name']);
    }
    return $data;
}