Skip to content
Carlos Rodrigues edited this page Jan 9, 2019 · 6 revisions

where

  • Condições, similar ao SQL WHERE.

Exemplo:

$registros = Registro::where([ 'nome' => 'Teste', 'cidade' => 'Natal']) // Usando array como hash, equivalente a "nome = 'Teste' AND cidade = 'Natal'"
    ->where('valor', '>', 100) // Usando parâmetros
    ->where('valor', '=', 150)
    ->where('valor', 150) // O igual (=) é opcional
    ->get();

Com relacionamentos

  • É possível se filtrar por um valor de um relacionamento utilizando o ponto (.):
// Trazer Escolas da cidade de São Paulo
$escolas = Escola::where('cidade.nome', 'São Paulo')->get()
# equivalente ao SQL (supondo que 'cidade' é 'select_1'):
SELECT *
FROM {tabela} AS main
INNER JOIN {tabela} AS cidade
    ON cidade.id = main.select_1
WHERE cidade.varchar_key = 'São Paulo'

Com children

  • Os valores dos childrens só podem ser usados no 'where' como filtro, para se obter os valores é necessário chamar children() no objeto.
// Trazer Noticias que tenham ao menos 1 filho chamado Vídeos e que seja do pais Austrália:
$noticias = Noticia::where('videos.pais_id', $australia->id)
    ->get();

// Caso seja necessário obter o nome dos Vídeos, por exemplo:
$noticia = $noticias->first();
$videos = $noticia->videos()
   ->where('pais_id', $australia->id) // É necessário repetir o filtro se não quiser vídeos de outro país
   ->get();

Verificando existência de relacionamento

  • Com uma tag qualquer
Registro::has('tags');
  • Irá resultar em
SELECT * 
FROM registro AS main
WHERE EXISTS (SELECT * FROM tags WHERE tags.id = main.id)
  • Com ao menos uma tag to tipo solicitado:
Registro::whereHas('tags', ['id_tipo' => 13]);
  • Irá resultar em
SELECT * 
FROM registro AS main
WHERE EXISTS (SELECT * FROM tags WHERE tags.id_tipo = 13 AND tags.id = main.id)
  • Com nenhuma tag:
Registro::whereDoesntHave('tags');

orderBy

  • A ordem padrão é definida automaticamente pelo cadastramento dos campos no InterAdmin, mas é possível alterar:
Registro::orderBy('nome')->orderBy('idade', 'DESC')->get();

groupBy

Registro::groupBy('nome')->get();
  • Irá resultar em
SELECT * 
FROM registro AS main
GROUP BY main.varchar_key

limit

Registro::skip(20)->take(10)->get();

published

Filtra por registros publicados (com mostrar, data de publicação no passado e não deletados).

  • Bool - Se estiver TRUE os filtros serão usados, se estiver FALSE eles não serão usados
    • O filtro procura registros com o campo char_key marcado, publish marcado, deleted desmarcado, date_expire superior à data atual ou vazio, e date_publish inferior à data atual.
  • Se esse campo não for passado para o options, então será usado o valor padrão que é obtido através de Record::isPublishedFiltersEnabled().
    • Esse valor padrão é TRUE no site (só mostra registros publicados) e FALSE no InterAdmin (mostra todos os registros).
Registro::published(false)->get();

debug

  • Boolean - Exibe o SQL que foi executado. Exemplo:
Registro::debug()->get(); 
  • Irá dar output no HTML com o SQL que foi executado.

joins

  • Opção para incluir Joins customizados
$audiences = Audience::select('nome', 'COUNT(id)')
    // também existem leftJoin() e rightJoin(), esse é o INNER JOIN
    ->join('material', Material::class, 'FIND_IN_SET(id, material.audience_ids)') 
    ->groupBy('id')
    ->get();

Queries parciais

$query = Registro::query(); // inicia query builder
if (Input::get('teste')) {
    $query->where(['nome' => 'Teste']); // constrói a query
}
$query->where('valor > 100');
$query->where('valor', 150);

$registros = $query->get(); // finaliza a query 

Escopos pré-definidos

class Carro extends InterAdmin {
    public function scopeUsados($query) {
       return $query->whereRaw('ano < YEAR(NOW())');
    }
    public function scopeCeltas($query) {
       return $this->where('modelo', 'Celta');
    }
    public function scopePagina($query, $n) {
       return $query->skip(($n - 1) * 20)->take(20);
    }
}

$carros = Carro::celtas()->usados()->pagina(1)->get();

Campos dos registros filhos no where

  • Obter todos os blogs que contenham ao menos um post publicado, trazendo os assuntos já carregados:
$blogs = Blog::where('posts.publicado', true)->get();

Ordenar pela contagem dos registros filhos

$noticias = Noticia
    ::select('COUNT(arquivos_para_download.id) AS arquivos_count', 'nome'),
    ->orderByRaw('`arquivos_count` DESC') // necessario usar acento grave para aliases
    ->get();
Clone this wiki locally