zeanwork.com.br  >>  Documentação  >>  Models
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.


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:
conditionsarray

Serve para criar uma condição (where). Veja mais em: Models >> Condições

fieldsarray | string

Define quais campos retornará de uma consulta.

dataarray

Define valores para uma inserções ou alteração.

joinarray

Define um join.

innerJoinarray

Define um inner join.

leftJoinarray

Define um left join.

rightJoinarray

Define um right join.

orderBystring

Define uma ordem.

groupByarray | string

Define campos para serem agrupados.

limitstring

Define um limite.

keyResultstring

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:
array $params [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:
mixed $value [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:
$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().


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:
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().



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:
number | boolean $id
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().



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:
number | boolean $id
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().



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.


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:
string $query
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:
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:
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:
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:
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:
class Posts extends AppModel {
	public $limit = '0, 8';
}