Skip to content

Query interface

danillos edited this page Apr 14, 2011 · 4 revisions

Aqui será mostrado as diversas maneiras de como obter os dados do banco de dados usando o DrumonModel, os exemplos serão baseados no modelo abaixo:

<?php

  class Post extends DrumonModel {
    
    var $table_name = 'posts';
    // var $primary_key = 'id'; // por padrão a chave primária é id.
    
  }

?>

Resultados

Os resultados das busca no DrumonModel por padrão são arrays associadas, pórem se passar o segundo argumento como true ele retorna um objeto da classe.

<?php
  $post_model = new Post();

  $post = $post_model->find(10);
  echo $post['id']; // => 10

  $post = $post_model->find(10, true);
  echo $post->id; // => 10
?>

Obtendo registros

<?php
  $post_model = new Post();

  // Encontra o post com a chave primaria = 10
  $post = $post_model->find(10); // sql => SELECT * FROM `posts` WHERE (posts.id = 10)

  // Encontra o post com as chaves primarias = 9 e 10
  $post = $post_model->find(array(9,10)); // sql => SELECT * FROM `posts` WHERE (posts.id IN (9,10))

  // Encontra o primeiro post
  $post = $post_model->first(); // sql => SELECT * FROM `posts` ORDER BY posts.id ASC LIMIT 1

  // Encontra o último post
  $post = $post_model->last(); // sql => SELECT * FROM `posts` ORDER BY posts.id DESC LIMIT 1

  // Encontra um registro
  $post = $post_model->one(); // sql => SELECT * FROM `posts` LIMIT 1

  // Encontra todos os registros
  $post = $post_model->all(); // sql => SELECT * FROM `posts`

?>

Condições

<?php
  $post_model = new Post();
 
  // Where simples
  $posts = $post_model->where(array('author' => 'danillo'))->all();
  # => SELECT * FROM `posts` WHERE (author = "danillo")


  // Where com IN
  $posts = $post_model->where(array('id' => array(1,2,3)))->all();
  # => SELECT * FROM `posts` WHERE (id IN (1,2,3))


  // Where string 
  $posts = $post_model->where('category = "internet"')->all(); 
  # => sql => SELECT * FROM `posts` WHERE (category = "internet") 


  // Pega os posts com mais de 10 comentários da categoria internet (1)
  $posts = $post_model->where('comments_count > 10 AND category = "internet"')->all();
  # => sql => SELECT * FROM `posts` WHERE (comments_count > 10 AND category = "internet") 


  // Pega os posts com mais de 10 comentários da categoria internet (2)
  $posts = $post_model->where('comments_count > ? AND categoty = ?',array(10, 'internet'))->all();
  # => sql => SELECT * FROM `posts` WHERE (comments_count > 10 AND category = `internet`)


  // Pega os posts com mais de 10 comentários da categoria internet (3)
  $posts = $post_model->where('comments_count > ?',array(10))->where('categoty = ?',array('internet'))->all(); 
  # => sql => SELECT * FROM `posts` WHERE (comments > 10) AND (category = 'internet')


  // Pega os posts com mais de 10 comentários da categoria internet (4)
  $posts = $post_model->where('comments_count > ?',array(10));
  $posts = $posts->where('categoty = ?',array('internet'))->all(); 
  # => sql => SELECT * FROM `posts` WHERE (comments > 10) AND (category = 'internet')
?>

Ordernar

<?php
  $post_model = new Post();
  
  // Ordena pela data de criação
  $posts = $post_model->order('created_at DESC')->all(); // SQL => SELECT * FROM `posts` ORDER BY created_at DESC
?>

Selecionando campos

<?php
  $post_model = new Post();

  // Seleciona id e title de todos os registros
  $posts = $post_model->select('id, title')->all(); // SQL => SELECT id, title FROM `posts`
?>

Limitando a busca

<?php
  $post_model = new Post();
  
  // Pega os 10 primeiros posts
  $posts = $post_model->limit(10)->all(); // SQL => SELECT * FROM `posts` LIMIT 10
  
  // Pega os 10 posts após os 5 primeiros posts encontrados.
  $posts = $post_model->limit(10)->offset(20)->all(); // SQL => SELECT * FROM `posts` LIMIT 10 OFFSET 20
  
?>

Agrupando

<?php
  $post_model = new Post();
  
  // Agrupa os posts por data de criação
  $posts = $post_model->group('date(created_at)')->order('created_at')->all(); // SQL => SELECT * FROM posts GROUP BY date(created_at) ORDER BY created_at
  
?>

Having

<?php
  $post_model = new Post();
  
  // Agrupa os posts por data de criação
  $posts = $post_model->group('date(created_at)')->having('category = ?',array('internet'))->all(); // SQL => SELECT * FROM posts GROUP BY date(created_at) HAVING categoty = 'internet'
  
?>

Joins

<?php
  $post_model = new Post();
  
  $posts_with_user = $post_model->join('INNER JOIN users ON users.id = posts.user_id')->all();
  // é mesmo que 			
  $join_array = $post_model->join(array('user'))->all();
  // SQL => SELECT * FROM `posts` INNER JOIN `users` ON `users`.id = `posts`.user_id
  
?>

Calculos

Existem alguns métodos utilizados para fazer calculos, todos eles são compativeis com a interface de query.

  • count
  • average
  • minimum
  • maximum
  • sum
<?php
  $post_model = new Post();
  
  // Quantidade de posts no banco de dados
  $posts_total = $post_model->count(); // SQL => SELECT count(*) FROM `posts`

   // Quantidade de posts da categoria internet
  $internet_total = $post_model->where('category = ',array('internet'))count(); // SQL => SELECT count(*) FROM `posts` WHERE (category = 'internet')
  
?>

Executando uma Query SQL.

<?php
  $post_model = new Post();
  
  // Quantidade de posts no banco de dados
  $posts = $post_model->find_by_sql('SELECT * FROM posts');
  
?>

Visualizar uma query gerada

<?php
  $post_model = new Post();
  
  // Quantidade de posts no banco de dados
  $posts = $post_model->where('title LIKE ?',array('%carro%'))->to_sql();
  echo $posts; // => SELECT * FROM `posts` WHERE title LIKE '%carro%';
  
?>

Clone this wiki locally