Don't you speak portuguese? Translate this site with Google Translator

Pensamento do Dia

Aquele que não duvida de nada não sabe nada. (Provérbio grego)

8.2 - O básico sobre o ORM

8.2 - O básico sobre o ORM

 

Fazer as coisas certas é mais importante do que fazer bem feitas as coisas.

Peter Drucker

Criar um novo aplicativo chamado cake_orm e um banco também cake_orm, com duas tabelas, relacionadas de acordo com a convenção do CakePHP: articles e comments para nossos testes, com o script abaixo:

-- Primeiro, criamos a tabela articles
CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(50),
    body TEXT,
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

INSERT INTO `articles` (`id`, `title`, `body`, `created`, `modified`) VALUES
(1,	'Título1',	'Corpo do primeiro artigo',	'2019-06-01 10:07:39',	NULL),
(2,	'Título2',	'Corpo do segundo artigo.',	'2019-06-01 10:07:39',	NULL),
(3,	'Título3',	'Corpo do terceiro artigo.',	'2019-06-01 10:07:39',	NULL),
(4,	'Título4',	'Corpo do quarto artigo',	'2019-06-02 00:00:00',	NULL),
(5,	'Título4',	'Corpo do quarto artigo',	'2019-06-02 00:00:00',	NULL);

CREATE TABLE comments (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comment VARCHAR(50),
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL,
    article_id int not null    
);

INSERT INTO comments (comment,created, article_id) VALUES ('Primeiro comantário', NOW(), 1),
 ('Segundo comantário', NOW(), 2),
 ('Terceiro comantário', NOW(), 3);

Configurar o aplicativo para este banco, setar o routes para Articles/index e

 

Gerar os CRUDs com o bake:

bin/cake bake all articles

bin/cake bake all comments

 

Exemplo de uso do find()

Num método, pode ser o initialize() do model ArticlesTable.php

list - retorna pares com chave e valor

$rets = $this->find('list', ['order'=>'id ASC']);

foreach($rets as $id=>$title){

echo "$id : $title<br>";

}

exit;

Num método, pode ser o index() do controller ArticlesController.php

$rets = $this->Articles->find('list', ['order'=>'id ASC']);

foreach($rets as $id=>$title){

echo "$id : $title<br>";

}

exit;

Obs.: observe que a diferença entre os usos no model ou no controller é que no controller precisamos usar Articles e no model não.

 

Recebendo a conexão default:

Abra o src/Model/Table/ArticlesTable.php

Adicione ao início, abaixo dos existentes:

use Cake\Datasource\ConnectionManager;

 

Crie uma nova função:

	public function artigos(){
		$conn = ConnectionManager::get('default');
		$artigos = $conn->execute("select * from articles")->fetchAll();
		return $artigos;
	}

Execute no initialize, ao final():

//debug($this->artigos()[0]);exit;
//debug($this->artigos()[0][2]);exit;
//debug($this->artigos()[0][2]);exit;
//debug($this->artigos()[2][2]);exit;

$arts = $this->artigos();


foreach($arts as $chave=>$valor){
    print 'Artigo';
    foreach($valor as $val){
        print $val.'<br>';
    }
}
exit;

Chame pelo navegador para ver o resultado

http://localhost/cake_orm

 

Executar consultas SQL

Sempre usar no início, para dar suporte

use Cake\Datasource\ConnectionManager;

 

Execute o código abaixo no initialize() da ArticlesTable

$conn = ConnectionManager::get('default');
$results = $conn
    ->execute('SELECT * FROM articles WHERE id = :id', ['id' => 1])
    ->fetchAll('assoc');
//debug($results);exit;
foreach($results as $chave=>$valor){
    foreach($valor as $val){
        print $val.'<br>';
    }
}
exit;

Chame pelo navegador para ver o resultado

 

Mais um exemplo:

Adicione ao final do initialize() do ArticlesTable

 

$conn = ConnectionManager::get('default');
$results = $conn
    ->execute(
        'SELECT * FROM articles WHERE title = :title', ['title'=>'Título1']
    )
    ->fetchAll('assoc');
debug($results);exit;
foreach($results as $chave=>$valor){
    foreach($valor as $val){
        print $val.'<br>';
    }
}
exit;

Sempre Chame pelo navegador para ver o resultado

 

Usando query builder

 

Adicione ao final do initialize()

$conn = ConnectionManager::get('default');
$results = $conn
    ->newQuery()
    ->select('*')
    ->from('articles')
    ->where(['title >' => 'Título1'])
    ->order(['title' => 'DESC'])
    ->execute()
    ->fetchAll('assoc');

//debug($results);exit;
foreach($results as $chave=>$valor){
    foreach($valor as $val){
        print $val.'<br>';
    }
}
exit;

Chame pelo navegador

 

Insert

$connection = ConnectionManager::get('default');

$connection->insert('articles', [

'title' => 'Título4',

'body' => 'Corpo do quarto artigo',

'created' => '2019-06-02',

], ['created' => 'datetime']);

 

Confira no banco de dados.

 

Update

$connection = ConnectionManager::get('default');

$connection->update('articles', ['title' => 'Título6'], ['id' => 6]);

Confira no banco

 

Delete

use Cake\Datasource\ConnectionManager;

$connection = ConnectionManager::get('default');

$connection->delete('articles', ['id' => 5]);

Confira no banco

 

Transações

$conn->begin();

$conn->update('articles', ['title' => 'Título6'], ['id' => 1]);

$conn->update('articles', ['title' => 'Título7'], ['id' => 1]);

//...

$conn->commit();

Confira no banco

 

Outro

$conn = ConnectionManager::get('default');

$conn->transactional(function ($conn) {

$conn->execute('UPDATE articles SET created = "2019-06-01 10:07:39" WHERE id = 6');

$conn->execute('UPDATE articles SET created = "2019-06-01 10:07:39" WHERE id = 4');

});

exit;

Confira no banco

 

Executando consultas

Cake\Database\Connection::query($sql)

Cake\Database\Connection::execute($sql, $params, $types)

 

$conn = ConnectionManager::get('default');

$stmt = $conn->query('UPDATE articles SET created = "2019-06-05" WHERE id = 6');

exit;

 

$conn = ConnectionManager::get('default');

$stmt = $conn->execute(

'UPDATE articles SET created = ? WHERE id = ?', ['2019-06-05', 2]

);

Confira no banco

 

Muito mais em:

https://book.cakephp.org/3.0/pt/orm/database-basics.html

Comments fornecido por CComment

Novo Testamento

Ele lhes disse: Vinde, e vede. Foram, e viram onde morava, e ficaram com ele aquele dia; e era já quase a hora décima.
(Jo, 1:39)

Rotas no Mapa do Google

© 2015 Ribamar FS. All Rights Reserved. Designed By JoomShaper