CakePHP 3 - 从数据库中检索单个字段的最简单方法

时间:2016-04-18 18:04:02

标签: cakephp cakephp-3.0

在CakePHP 2中,我可以这样做:

$name = $this->User->field('name', ['email' => 'user@example.com']);

在CakePHP 3中你必须做这样的事情来实现同样的目标:

$users = TableRegistry::get('Users');

$query = $users->find()
    ->select('name')
    ->where(['email' => 'user@example.com']);

$name = $query->isEmpty() ? null : $query->first()->name;

是否有更简单的方法来执行这些操作?我对新的ORM不太熟悉。

编辑:我添加了一个为Cake 3添加此行为的类示例:

https://stackoverflow.com/a/42136955/851885

3 个答案:

答案 0 :(得分:5)

这可能比你的简单

      String user= getIntent().getExtras().getString("user");
      TextView textView=(TextView) findViewById(R.id.login_name_drawer);
      textView.setText(user);

确保在使用get函数时,该参数应该是表中的主键。

答案 1 :(得分:3)

可以通过自定义行为将此功能添加到任何表格。

另存为 src / Model / Behavior / EnhancedFinderBehavior.php

<?php
namespace App\Model\Behavior;

use Cake\ORM\Behavior;

/**
 * EnhancedFinder behavior
 * 
 * Behavior providing additional methods for retrieving data.
 */
class EnhancedFinderBehavior extends Behavior
{

    /**
     * Retrieve a single field value
     * 
     * @param  string $fieldName The name of the table field to retrieve.
     * @param  array $conditions An array of conditions for the find.
     * @return mixed The value of the specified field from the first row of the result set.
     */
    public function field($fieldName, array $conditions)
    {
        $field = $this->_table->alias() . '.' . $fieldName;
        $query = $this->_table->find()->select($field)->where($conditions);

        if ($query->isEmpty()) {
            return null;
        }
        return $query->first()->{$fieldName};
    }
}

<强>用法

将行为添加到您的班级:

<?php
namespace App\Model\Table;

use Cake\ORM\Table;

class UsersTable extends Table
{

    public function initialize(array $config)
    {
        $this->addBehavior('EnhancedFinder');
    }
}

现在你可以使用像Cake 2这样的取景器:

$name = $this->User->field('name', ['id' => 1]);

答案 2 :(得分:2)

不,CakePHP 3.x中没有。

如果你想让那个方法在一个行为中或者使用一个特征作为一个查找器实现它,并将它与你的表对象一起使用。