Models
O modelo de dados ou Model representa a estrutura de dados. É através do Model que você faz consultas, alterações, inserções e exclusões de registros no banco de dados.
O Zeanwork auxilia você com essas tarefas sem que você precise escrever uma única linha de código SQL. Todos os dados e condições a serem enviados ao banco são montados através de arrays simples ou métodos do Zeanwork, sem que você precise de grandes conhecimentos de SQL.
Como você deve ter visto na estrutura do Zeanwork, temos um diretório somente para armazenar os arquivos dos models, é localizado em App/Models/. Você também deve ter visto os padrões do Zeanwork, o nome do arquivo deve ser no padrão lowerCamelCase, seguindo com a extensão .php. Por exemplo: nomeDoModel.php.
Todo model deve ser uma classe, portando o nome da classe deve corresponder o nome do arquivo criado. Por exemplo: Você criou um arquivo chamado nomeDoModel.php, o nome da classe deve ser NomeDoModel, seguindo o padrão CamelCase.
Todos os models devem ser estendidos da classe AppModel, pois o seu model deve herdar os métodos do Zeanwork. Se você desejar criar métodos que serão utilizados em alguns dos seus models, você deve recriar o model AppModel no mesmo local dos models comuns, este model deverá ser estentido da classe Model.
Veja exemplo de um model comun:
Veja exemplo do AppModel:
Como uma das funcionalidades dos models é executar operações em um banco de dados, nós devemos definir a perspectiva tabela que pertence este model e sua chave primária. Para esta tarefa nós devemos utilizar as seguintes variáveis da classe Model: Model::$table e Model:$primaryKey.
Veja exemplo:
Estes parâmetros servem para configurar suas querys nas consultas, inserções, alterações e exclusões de dados, você deve avaliar o que irá solucionar o seu problema e assim utilizalas.
Veja quais parâmetros estão disponíveis.
Veja exemplo:
Query montada pelo Zeanwork:
Temos várias maneiras de buscar registros de um banco de dados, você pode utilizar a que for mais adequada para você ou para solucionar o seu problema da melhor forma possivel.
Veja os métodos disponiveis:
Veja os métodos disponíveis para inserir registros no banco de dados.
Veja os métodos disponíveis para alterar registros de um banco de dados.
Veja os métodos disponíveis para deletar registros de um banco de dados.
O Zeanwork possui um método automático que salva dados em uma tabela, tanto para uma alteração quanto para uma inserção.
Os dados são resgatados automáticamente do form pelo método post, o Zeanwork identifica os campos que existem em sua tabela e os que existem no form, com isso ele sabe quais dados serão alterados ou inseridos.
Para que o Zeanwork idendifique qual campo do seu form corresponde ao campo da tabela, você deve criar as tags do form com o name igual ao nome do campo correspondente da tabela.
Para o Zeanwork saber se será uma alteração ou uma inserção, ele verifica se foi informado um valor para a chave primária da tabela e se existir o registro na tabela, o Zeanwork fará uma alteração neste registro, caso contrário fará uma inserção.
O Zeanwork também verifica se existe os campos created e modified, estes campos servirão para salvar a data da alteração ou inserção do registro, estes campos devem ser do tipo datetime ou date.
O Zeanwork também executa a validação automáticamente antes de salvar os dados, em caso de erro ele não salvará.
Parâmetros:
Retorno:
Veja exemplo:
O Zeanwork possui um método que facilita a contagem de registros de um banco de dados.
Parâmetros:
Retorno:
Veja exemplo:
Em certos casos precisamos verificar se existe um determinado registro em uma tabela, por isso temos esse método.
Parâmetros:
Retorno:
Veja exemplo:
Em aplicações mais complexas, é comum haver querys que o Zeanwork não venha atender ou o tempo de execução é muito alto, então você tem essa opção de executar manualmente as instruções SQL’s.
Existe uma opção de configurar parâmetros padrões para as instruções realizadas apartir dos métodos do model.
O Zeanwork auxilia você com essas tarefas sem que você precise escrever uma única linha de código SQL. Todos os dados e condições a serem enviados ao banco são montados através de arrays simples ou métodos do Zeanwork, sem que você precise de grandes conhecimentos de SQL.
Criando um model
Como você deve ter visto na estrutura do Zeanwork, temos um diretório somente para armazenar os arquivos dos models, é localizado em App/Models/. Você também deve ter visto os padrões do Zeanwork, o nome do arquivo deve ser no padrão lowerCamelCase, seguindo com a extensão .php. Por exemplo: nomeDoModel.php.
Todo model deve ser uma classe, portando o nome da classe deve corresponder o nome do arquivo criado. Por exemplo: Você criou um arquivo chamado nomeDoModel.php, o nome da classe deve ser NomeDoModel, seguindo o padrão CamelCase.
Todos os models devem ser estendidos da classe AppModel, pois o seu model deve herdar os métodos do Zeanwork. Se você desejar criar métodos que serão utilizados em alguns dos seus models, você deve recriar o model AppModel no mesmo local dos models comuns, este model deverá ser estentido da classe Model.
Veja exemplo de um model comun:
class Posts extends AppModel {
}
Veja exemplo do AppModel:
class AppModel extends Model {
}
Como uma das funcionalidades dos models é executar operações em um banco de dados, nós devemos definir a perspectiva tabela que pertence este model e sua chave primária. Para esta tarefa nós devemos utilizar as seguintes variáveis da classe Model: Model::$table e Model:$primaryKey.
Veja exemplo:
class Posts extends AppModel {
public $table = 'posts';
public $primaryKey = 'idPosts';
}
Parâmetros
Estes parâmetros servem para configurar suas querys nas consultas, inserções, alterações e exclusões de dados, você deve avaliar o que irá solucionar o seu problema e assim utilizalas.
Veja quais parâmetros estão disponíveis.
| Nome do parâmetro: | Informações: |
| conditions | array Serve para criar uma condição (where). Veja mais em: Models >> Condições |
| fields | array | string Define quais campos retornará de uma consulta. |
| data | array Define valores para uma inserções ou alteração. |
| join | array Define um join. |
| innerJoin | array Define um inner join. |
| leftJoin | array Define um left join. |
| rightJoin | array Define um right join. |
| orderBy | string Define uma ordem. |
| groupBy | array | string Define campos para serem agrupados. |
| limit | string Define um limite. |
| keyResult | string Define a chave da array do resultado, deve ser o nome de um campo da tabela. |
Veja exemplo:
$this->posts->read(array(
'fields' => array('name', 'users.name as nameUser')
, 'join' => array('users' => array('users.idUsers' => 'posts.idPosts'))
, 'conditions' => array('users.created <' => now())
, 'groupBy' => 'name'
, 'limit' => 20
)
);
Query montada pelo Zeanwork:
SELECT name, users.name as nameUser FROM posts JOIN users ON users.idUsers = posts.idPosts WHERE users.created < '2010-07-13 17:21:30' GROUP BY name LIMIT 20
Nota: Os dados informados pelos parâmetros aqui apresentados, são filtrados automáticamente para evitar SQL Injection.
Buscando registros
Temos várias maneiras de buscar registros de um banco de dados, você pode utilizar a que for mais adequada para você ou para solucionar o seu problema da melhor forma possivel.
Veja os métodos disponiveis:
Model::read()
Este método retorna uma lista de registros.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
array $params [opcional]
mixed $id [opcional]
Parâmetros para o select.
mixed $id [opcional]
Se você desejar buscar um registro cuja a chave primaria seja igual a do valor informado.
Retorno:
array
Retorna uma matriz que corresponde a todas as linhas obtidas no select.
Veja exemplo:
$this->posts->read(); //Retorno Array ( [0] => Array ( [idPosts] => 1 [name] => Um pouco mais sobre o Zeanwork [text] => Texto, Texto.... ) [1] => Array ( [idPosts] => 2 [name] => Um pouco mais sobre o Zeanwork [text] => Texto, Texto do post 2.... ) [2] => Array ( [idPosts] => 3 [name] => Um pouco mais sobre o Zeanwork e MVC [text] => Texto, Texto do post 3.... ) )
Model::select()
Este método é apenas uma alias para o método Model::read().
Model::findAllBy()
Este método procura um registro cujo um valor de um campo da tabela seja igual a outro valor informado por parâmetros. Também deve ser informado um sufixo juntamente com o nome do método, este sufixo deve ser o nome do campo da tabela. O retorno é uma lista de registros.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
mixed $value [opcional]
array $conditions [opcional]
array $params [opcional]
Valor para comparação.
array $conditions [opcional]
Condições adcionais.
array $params [opcional]
Parâmetros para o select.
Retorno:
array
Retorna uma matriz que corresponde a todas as linhas obtidas no select. (igual ao método: Model::read())
Veja exemplo:
$this->posts->findAllByName('Um pouco mais sobre o Zeanwork');
//Retorno
Array
(
[0] => Array
(
[idPosts] => 1
[name] => Um pouco mais sobre o Zeanwork
[text] => Texto, Texto....
)
[1] => Array
(
[idPosts] => 2
[name] => Um pouco mais sobre o Zeanwork
[text] => Texto, Texto do post 2....
)
)
Model::findBy()
Este método é igual ao Model::findAllBy(), porém ele retorna somente um registro.
Veja exemplo:
Veja exemplo:
$this->posts->findByName('Um pouco mais sobre o Zeanwork');
//Retorno
Array
(
[idPosts] => 1
[name] => Um pouco mais sobre o Zeanwork
[text] => Texto, Texto....
)
Model::executeRead()
Este método utiliza a tecnologia de encadeamento de métodos (Method chaining), veja mais em: Models >> Methods chaining
O retorno deste método é o mesmo do Model::read().
O retorno deste método é o mesmo do Model::read().
Model::executeSelect()
Este método é apenas uma alias para o método Model::executeRead().
Inserindo registros
Veja os métodos disponíveis para inserir registros no banco de dados.
Model::create()
Este método faz um insert em uma tabela no banco de dados.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
array $data
Dados que serão inseridos, o key da array deve ser o nome do campo da tabela.
Retorno:
number
Número de linhas afetadas pelo insert.
Veja exemplo:
$this->posts->create(array( 'name' => 'Nome do post' , 'text' => 'Texto para o post' ) );
Model::insert()
Este método é apenas uma alias para o método Model::create().
Model::executeInsert()
Este método utiliza a tecnologia de encadeamento de métodos (Method chaining), veja mais em: Models >> Methods chaining
O retorno deste método é o mesmo do Model::create().
O retorno deste método é o mesmo do Model::create().
Alterando registros
Veja os métodos disponíveis para alterar registros de um banco de dados.
Model::update()
Este método faz um update em um registro da tabela no banco de dados.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
number | boolean $id
array $params
array $data
Id do resgistro a ser alterado, caso seja informado um número, o Zeanwork criará automáticamente a condição para a chave primária. Se você não desejar utilizar esta condição, você deve informar o valor ‘false’ (boolean).
array $params
Parâmetros para o update.
array $data
Dados que serão alterados, a chave da array deve ser o nome do campo da tabela.
Retorno:
number
Número de linhas afetadas pelo update.
Veja exemplo:
$this->posts->update( 1039 , array() , array( 'name' => 'Novo nome do post' , 'text' => 'Novo texto para o post' ) );
Model::executeUpdate()
Este método utiliza a tecnologia de encadeamento de métodos (Method chaining), veja mais em: Models >> Methods chaining
O retorno deste método é o mesmo do Model::update().
O retorno deste método é o mesmo do Model::update().
Deletando registros
Veja os métodos disponíveis para deletar registros de um banco de dados.
Model::delete()
Este método apaga registros da tabela no banco de dados.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
number | boolean $id
array $params [opcional]
Id do resgistro a ser deletado, caso seja informado um número, o Zeanwork criará automáticamente a condição para a chave primária. Se você não desejar utilizar esta condição, você deve informar o valor ‘false’ (boolean).
array $params [opcional]
Parâmetros para o delete.
Retorno:
number
Número de linhas afetadas pelo delete.
Veja exemplo:
$this->posts->delete(1039);
Model::executeDelete()
Este método utiliza a tecnologia de encadeamento de métodos (Method chaining), veja mais em: Models >> Methods chaining
O retorno deste método é o mesmo do Model::delete().
O retorno deste método é o mesmo do Model::delete().
Salvando registros automáticamente
O Zeanwork possui um método automático que salva dados em uma tabela, tanto para uma alteração quanto para uma inserção.
Os dados são resgatados automáticamente do form pelo método post, o Zeanwork identifica os campos que existem em sua tabela e os que existem no form, com isso ele sabe quais dados serão alterados ou inseridos.
Para que o Zeanwork idendifique qual campo do seu form corresponde ao campo da tabela, você deve criar as tags do form com o name igual ao nome do campo correspondente da tabela.
Para o Zeanwork saber se será uma alteração ou uma inserção, ele verifica se foi informado um valor para a chave primária da tabela e se existir o registro na tabela, o Zeanwork fará uma alteração neste registro, caso contrário fará uma inserção.
O Zeanwork também verifica se existe os campos created e modified, estes campos servirão para salvar a data da alteração ou inserção do registro, estes campos devem ser do tipo datetime ou date.
O Zeanwork também executa a validação automáticamente antes de salvar os dados, em caso de erro ele não salvará.
Model::autoSave()
Parâmetros:
array $data [opcional]
Dados que não se originaram do método post.
Caso você informe um valor que venha pelo post, o Zeanwork rescreverá este valor, ficando somente os dados aqui informados.
A chave da array deve ser o nome do campo da tabela.
Caso você informe um valor que venha pelo post, o Zeanwork rescreverá este valor, ficando somente os dados aqui informados.
A chave da array deve ser o nome do campo da tabela.
Retorno:
number
Número de linhas afetadas pelo insert ou update.
Veja exemplo:
// Controller
$this->posts->autoSave(array('idPosts' => $this->getParam('id')));
// View
Contando registros
O Zeanwork possui um método que facilita a contagem de registros de um banco de dados.
Model::count()
Parâmetros:
array $params [opcional]
Parâmetros para o count.
Retorno:
number
Número de registros encontrado.
Veja exemplo:
$this->posts->count(array('conditions' => array('published' => 1));
Verificando de existe um registro
Em certos casos precisamos verificar se existe um determinado registro em uma tabela, por isso temos esse método.
Model::exists()
Parâmetros:
number $id
Valor da chave primária para a condição.
Retorno:
boolean
True se existir o registro e false se não existir.
Veja exemplo:
$this->posts->exists(542);
Executando SQL manualmente
Em aplicações mais complexas, é comum haver querys que o Zeanwork não venha atender ou o tempo de execução é muito alto, então você tem essa opção de executar manualmente as instruções SQL’s.
Model::query()
Com este método você exetuda uma instrução SQL.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
string $query
string $database [opcional]
Query a ser executada.
string $database [opcional]
Nome do banco de dados. Este parâmetro é util quando você desejar executar uma query em outro banco de dados porem na mesma conexão.
Retorno:
boolean
True se não houve erro e false se existir.
Veja exemplo:
$this->posts->query('SELECT * FROM posts WHERE published = 1');
Model::fetch()
Este método busca uma linha obtida da query.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
string $position [opcional]
Caso você deseja pegar somente um valor do resultado obtido, você deve informar o nome do campo que deseja.
Retorno:
array | mixed
Se você deseja pegar todos os dados obtidos na linha, então retorna uma array, caso contrário retornará o valor do campo especificado.
Veja exemplo:
// Informando a posição
while($name = $this->posts->fetch('name')){
echo $name;
}
// Retornado toda a linha obtida
while($row = $this->posts->fetch()){
echo $row['name'];
}
Model::fetchAll()
Este método busca todas as linha obtida da query.
Parâmetros:
Retorno:
Veja exemplo:
Parâmetros:
Este método não possui parâmetros.
Retorno:
array
Retorna uma matriz que corresponde a todas as linhas obtidas.
Veja exemplo:
$this->posts->fetchAll(); //Retorno Array ( [0] => Array ( [idPosts] => 1 [name] => Um pouco mais sobre o Zeanwork post 1 [text] => Texto, Texto.... ) [1] => Array ( [idPosts] => 2 [name] => Um pouco mais sobre o Zeanwork post 2 [text] => Texto, Texto do post 2.... ) )
Nota: As instruções SQL’s que foram criadas manualmente, não são filtrados automáticamente, assim passibilita ataques de SQL Injection.
Parâmetros padrões
Existe uma opção de configurar parâmetros padrões para as instruções realizadas apartir dos métodos do model.
Model::$conditions
Armazena as condições padrões para suas querys.
Os valores aqui informados serão fundidos com os valores informados nos métodos.
O valor a ser informado é uma array.
Veja exemplo:
Os valores aqui informados serão fundidos com os valores informados nos métodos.
O valor a ser informado é uma array.
Veja exemplo:
class Posts extends AppModel {
public $conditions = array('published' => 1);
}
Model::$orderBy
Armazena o order by padão para suas querys.
Se não foi informado este valor pelos métodos, então utilizara desta variável.
O valor a ser informado é uma string.
Veja exemplo:
Se não foi informado este valor pelos métodos, então utilizara desta variável.
O valor a ser informado é uma string.
Veja exemplo:
class Posts extends AppModel {
public $orderBy = 'created DESC';
}
Model::$limit
Armazena o limit padão para suas querys.
Se não foi informado este valor pelos métodos, então utilizara desta variável.
O valor a ser informado deve ser uma string ou números.
Veja exemplo:
Se não foi informado este valor pelos métodos, então utilizara desta variável.
O valor a ser informado deve ser uma string ou números.
Veja exemplo:
class Posts extends AppModel {
public $limit = '0, 8';
}



