CakePHP 3-Самый простой способ получить одно поле из базы данных

в 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;

есть ли более простой способ выполнения таких операций? Я не очень хорошо знаком с новым Ормом.


Edit: я добавил пример класса, который добавляет Это поведение для Cake 3:

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

3 ответов


Это может быть проще, чем ваша

$users = TableRegistry::get('Users');
$name = $users->get(1)->name;

убедитесь, что при использовании функции get параметр должен быть первичным ключом в таблице.


нет, нет в CakePHP 3.x.

Если вы хотите, чтобы этот метод вернулся, реализуйте его либо в поведении, либо как искатель, используя признак, и используйте его с объектами таблицы.


можно добавить эту функцию в любую таблицу с помощью пользовательского поведения.

Сохранить как src / модель / поведение / 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');
    }
}

Теперь вы можете использовать finder, как торт 2:

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