2016-04-18 5 views
8

In CakePHP 2 abrufen ich so etwas tun könnte:CakePHP 3 - Der einfachste Weg, ein einzelnes Feld aus der Datenbank

$name = $this->User->field('name', ['email' => '[email protected]']); 

In CakePHP 3 Sie haben so etwas zu tun, das Gleiche zu erreichen:

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

$query = $users->find() 
    ->select('name') 
    ->where(['email' => '[email protected]']); 

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

Gibt es einen einfacheren Weg, diese Art von Operationen durchzuführen? Ich kenne das neue ORM nicht sehr gut.


Edit: Ich habe ein Beispiel einer Klasse hinzugefügt, die dieses Verhalten für Kuchen fügt 3:

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

Antwort

2

Es ist möglich, diese Funktionalität über ein benutzerdefiniertes Verhalten zu jeder Tabelle hinzuzufügen.

Speichern unter src/Modell/Verhalten/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}; 
    } 
} 

Nutzungs

das Verhalten Ihrer Klasse hinzufügen:

<?php 
namespace App\Model\Table; 

use Cake\ORM\Table; 

class UsersTable extends Table 
{ 

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

Nun können Sie den Sucher wie Kuchen 2 verwenden:

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

Nein, es nicht in CakePHP 3.x.

Wenn Sie diese Methode zurück implementieren möchten, implementieren Sie sie entweder in einem Verhalten oder als Finder mit einem Merkmal und verwenden Sie es mit Ihren Tabellenobjekten.

5

Dies könnte einfacher sein, als Ihre

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

Stellen Sie sicher, dass, wenn Sie die get-Funktion verwenden, sollte der Parameter ein Primärschlüssel in der Tabelle sein.

+1

Ist für diese Methode nicht das Query-Objekt alle Felder auszuwählen, obwohl, was bedeutet, ein Feld, um es 100 Felder aus der Tabelle auswählen können? – BadHorsie

+1

@BadHorsie Ja. es bekommt alle Felder. Wenn Sie ein Feld für eine bessere Leistung auswählen möchten, sollten Sie die Methode find verwenden, um das Feld auszuwählen. –

+0

@Eric Lee, Danke. Sie sparen meine Zeit. –

Verwandte Themen