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
ONcidade.id=main.select_1WHEREcidade.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 WHEREtags.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 WHEREtags.id_tipo=13ANDtags.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 BYmain.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 builderif (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 {
publicfunctionscopeUsados($query) {
return$query->whereRaw('ano < YEAR(NOW())');
}
publicfunctionscopeCeltas($query) {
return$this->where('modelo', 'Celta');
}
publicfunctionscopePagina($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();