Usando Eloquent ORM no Laravel para realizar pesquisas de banco de dados usando LIKE

94

Quero usar a construção de registro ativo do Eloquent para construir uma consulta de pesquisa, mas será uma pesquisa LIKE. Encontrei o User::find($term)ou User::find(1), mas isso não está gerando uma declaração semelhante. Não estou procurando uma resposta direta, mas se alguém pudesse pelo menos me dar uma direção para procurar isso seria ótimo!

Jonathan
fonte
2
laravel.com/docs/database/eloquent .. você pode usar a documentação que é muito clara.
ytsejam
2
Eu vi esta página, mas não vi nada sobre pesquisar com curingas. Eu também não queria configurar uma regex em um loop foreach, pois há centenas de milhares de linhas
Jonathan
$ email = DB :: table ('users') -> where ('id', '=', 1) -> only ('email');
ytsejam
ele é chamado de criador de consultas fluente nos documentos.
ytsejam
Se eu pudesse marcar a resposta e seu comentário como resposta, eu o faria. Obrigado por me colocar na direção certa
Jonathan

Respostas:

235

Você é capaz de encontrar bancos de dados usando LIKE com esta sintaxe:

Model::where('column', 'LIKE', '%value%')->get();
Joel Larson
fonte
1
não tão eficiente, gera "Erro fatal: nível máximo de aninhamento de função de '100' atingido, abortando! em ..."
Sasi varna kumar
@gsk Acho que você entra (usando o método with ()) e pode pesquisar a coluna normalmente. A sintaxe é provavelmente algo assim table.field.
Anthony
64

Se você precisa usar LIKE com frequência, pode simplificar um pouco o problema. Um método personalizado como () pode ser criado no modelo que herda o Eloquent ORM:

public  function scopeLike($query, $field, $value){
        return $query->where($field, 'LIKE', "%$value%");
}

Então, você pode usar esse método da seguinte maneira:

User::like('name', 'Tomas')->get();
Yaroslav
fonte
Esta é a maneira mais 'Laravel' de fazer isso. É apenas mais limpo e permite que você ajuste o escopo em um lugar, em vez de ter que dar a volta e ajustar cada um ->where().
Daniel Dewhurst
realmente amo essa resposta. Isso torna o modelo e seu uso muito elegantes, que é o objetivo do laravel.
deathemperor
29

Para sua informação, a lista de operadores (contendo like e todos os outros) está no código:

/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

protected $operators = array(
    '=', '<', '>', '<=', '>=', '<>', '!=',
    'like', 'not like', 'between', 'ilike',
    '&', '|', '^', '<<', '>>',
    'rlike', 'regexp', 'not regexp',
);

aviso Legal:

A resposta de Joel Larson está correta. Tenho meu voto positivo.

Espero que esta resposta esclareça mais o que está disponível por meio do Eloquent ORM ( aponta as pessoas diretamente ). Embora um link para a documentação seja muito melhor, esse link provou ser ilusório.

reitor grande
fonte
18

Use aspas duplas em vez de aspas simples, por exemplo:

where('customer.name', 'LIKE', "%$findcustomer%")

Abaixo está o meu código:

public function searchCustomer($findcustomer)
{
    $customer = DB::table('customer')
                  ->where('customer.name', 'LIKE', "%$findcustomer%")
                  ->orWhere('customer.phone', 'LIKE', "%$findcustomer%")
                  ->get();

    return View::make("your view here");
}
Myint Thu Lwin
fonte
3

Se você não gosta de aspas duplas como eu, isso funcionará para você com aspas simples:

$value = Input::get('q');
$books = Book::where('name', 'LIKE', '%' . $value . '%')->limit(25)->get();

return view('pages/search/index', compact('books'));
Sinan Eldem
fonte