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:
Comments fornecido por CComment