DboSource::read PHP Method

read() public method

Reads record(s) from the database.
public read ( Model $Model, array $queryData = [], integer $recursive = null ) : mixed
$Model Model A Model object that the query is for.
$queryData array An array of queryData information containing keys similar to Model::find().
$recursive integer Number of levels of association
return mixed boolean false on error/failure. An array of results on success.
    public function read(Model $Model, $queryData = array(), $recursive = null)
    {
        $queryData = $this->_scrubQueryData($queryData);
        $array = array('callbacks' => $queryData['callbacks']);
        if ($recursive === null && isset($queryData['recursive'])) {
            $recursive = $queryData['recursive'];
        }
        if ($recursive !== null) {
            $modelRecursive = $Model->recursive;
            $Model->recursive = $recursive;
        }
        if (!empty($queryData['fields'])) {
            $noAssocFields = true;
            $queryData['fields'] = $this->fields($Model, null, $queryData['fields']);
        } else {
            $noAssocFields = false;
            $queryData['fields'] = $this->fields($Model);
        }
        if ($Model->recursive === -1) {
            // Primary model data only, no joins.
            $associations = array();
        } else {
            $associations = $Model->associations();
            if ($Model->recursive === 0) {
                // Primary model data and its domain.
                unset($associations[2], $associations[3]);
            }
        }
        $originalJoins = $queryData['joins'];
        $queryData['joins'] = array();
        // Generate hasOne and belongsTo associations inside $queryData
        $linkedModels = array();
        foreach ($associations as $type) {
            if ($type !== 'hasOne' && $type !== 'belongsTo') {
                continue;
            }
            foreach ($Model->{$type} as $assoc => $assocData) {
                $LinkModel = $Model->{$assoc};
                if ($Model->useDbConfig !== $LinkModel->useDbConfig) {
                    continue;
                }
                if ($noAssocFields) {
                    $assocData['fields'] = false;
                }
                $external = isset($assocData['external']);
                if ($this->generateAssociationQuery($Model, $LinkModel, $type, $assoc, $assocData, $queryData, $external) === true) {
                    $linkedModels[$type . '/' . $assoc] = true;
                }
            }
        }
        if (!empty($originalJoins)) {
            $queryData['joins'] = array_merge($queryData['joins'], $originalJoins);
        }
        // Build SQL statement with the primary model, plus hasOne and belongsTo associations
        $query = $this->buildAssociationQuery($Model, $queryData);
        $resultSet = $this->fetchAll($query, $Model->cacheQueries);
        unset($query);
        if ($resultSet === false) {
            $Model->onError();
            return false;
        }
        $filtered = array();
        // Filter hasOne and belongsTo associations
        if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
            $filtered = $this->_filterResults($resultSet, $Model);
        }
        // Deep associations
        if ($Model->recursive > -1) {
            $joined = array();
            if (isset($queryData['joins'][0]['alias'])) {
                $joined[$Model->alias] = (array) Hash::extract($queryData['joins'], '{n}.alias');
            }
            foreach ($associations as $type) {
                foreach ($Model->{$type} as $assoc => $assocData) {
                    $LinkModel = $Model->{$assoc};
                    if (!isset($linkedModels[$type . '/' . $assoc])) {
                        $db = $Model->useDbConfig === $LinkModel->useDbConfig ? $this : $LinkModel->getDataSource();
                    } elseif ($Model->recursive > 1) {
                        $db = $this;
                    }
                    if (isset($db) && method_exists($db, 'queryAssociation')) {
                        $stack = array($assoc);
                        $stack['_joined'] = $joined;
                        $db->queryAssociation($Model, $LinkModel, $type, $assoc, $assocData, $array, true, $resultSet, $Model->recursive - 1, $stack);
                        unset($db);
                        if ($type === 'hasMany' || $type === 'hasAndBelongsToMany') {
                            $filtered[] = $assoc;
                        }
                    }
                }
            }
            if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
                $this->_filterResults($resultSet, $Model, $filtered);
            }
        }
        if ($recursive !== null) {
            $Model->recursive = $modelRecursive;
        }
        return $resultSet;
    }

Usage Example

 /**
  * testRealQueries method
  *
  * @return void
  */
 public function testRealQueries()
 {
     $this->loadFixtures('Apple', 'Article', 'User', 'Comment', 'Tag', 'Sample', 'ArticlesTag');
     $Apple = ClassRegistry::init('Apple');
     $Article = ClassRegistry::init('Article');
     $result = $this->Dbo->rawQuery('SELECT color, name FROM ' . $this->Dbo->fullTableName('apples'));
     $this->assertTrue(!empty($result));
     $result = $this->Dbo->fetchRow($result);
     $expected = array($this->Dbo->fullTableName('apples', false, false) => array('color' => 'Red 1', 'name' => 'Red Apple 1'));
     $this->assertEquals($expected, $result);
     $result = $this->Dbo->fetchAll('SELECT name FROM ' . $this->Dbo->fullTableName('apples') . ' ORDER BY id');
     $expected = array(array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'Red Apple 1')), array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'Bright Red Apple')), array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'green blue')), array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'Test Name')), array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'Blue Green')), array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'My new apple')), array($this->Dbo->fullTableName('apples', false, false) => array('name' => 'Some odd color')));
     $this->assertEquals($expected, $result);
     $result = $this->Dbo->field($this->Dbo->fullTableName('apples', false, false), 'SELECT color, name FROM ' . $this->Dbo->fullTableName('apples') . ' ORDER BY id');
     $expected = array('color' => 'Red 1', 'name' => 'Red Apple 1');
     $this->assertEquals($expected, $result);
     $Apple->unbindModel(array(), false);
     $result = $this->Dbo->read($Apple, array('fields' => array($Apple->escapeField('name')), 'conditions' => null, 'recursive' => -1));
     $expected = array(array('Apple' => array('name' => 'Red Apple 1')), array('Apple' => array('name' => 'Bright Red Apple')), array('Apple' => array('name' => 'green blue')), array('Apple' => array('name' => 'Test Name')), array('Apple' => array('name' => 'Blue Green')), array('Apple' => array('name' => 'My new apple')), array('Apple' => array('name' => 'Some odd color')));
     $this->assertEquals($expected, $result);
     $result = $this->Dbo->read($Article, array('fields' => array('id', 'user_id', 'title'), 'conditions' => null, 'recursive' => 1));
     $this->assertTrue(Set::matches('/Article[id=1]', $result));
     $this->assertTrue(Set::matches('/Comment[id=1]', $result));
     $this->assertTrue(Set::matches('/Comment[id=2]', $result));
     $this->assertFalse(Set::matches('/Comment[id=10]', $result));
 }
All Usage Examples Of DboSource::read
DboSource