I am using L5.2 and MySQL 5.7. I have the following JSON on my meta column in the DB:
{"cellphone": "(687) 638-4512 x22934", "last_name": "Bashirian", "first_name": "Fidel"}
I am trying to get the following query to run whether the string is uppercase or lowercase:
User::where('meta->first_name', 'fidel');
I have tried something like:
User::whereRaw('LOWER(meta->"$.first_name") = ?', ['fidel']);
But that is returning null. Any idea on how to do this!?
I also wanted to be able to do queries by fullname for example 'fidel bashirian'. I tried with concat() but I am not sure if that works with JSON column types, so I ended up making it work with the following function:
protected function name($name)
{
$name = explode(' ', $name);
foreach ($name as $key => $value) {
$name[$key] = '%' . strtolower($value) . '%';
$this->builder->where(function ($query) use ($name, $key) {
$query->whereRaw('LOWER(meta->"$.first_name") like ?', [$name[$key]]);
$query->orWhereRaw('LOWER(meta->"$.last_name") like ?', [$name[$key]]);
});
}
return $this->builder;
}
With the previous method querying by fidel, Fidel, FIDEL, fidel bashirian, etc.. will all yield results. Even with partial first or last names.
I solved it by using this method. With this I am able to do queries by fullname (first + ' ' + last) or by first or last names. I am not sure if this is the most elegant solution thought.
protected function name($name)
{
$name = explode(' ', $name);
foreach ($name as $key => $value) {
$name[$key] = '%' . strtolower($value) . '%';
$this->builder->where(function ($query) use ($name, $key) {
$query->whereRaw('LOWER(meta->"$.first_name") like ?', [$name[$key]]);
$query->orWhereRaw('LOWER(meta->"$.last_name") like ?', [$name[$key]]);
});
}
return $this->builder;
}
With the previous method querying by fidel, Fidel, FIDEL, fidel bashirian, etc.. will all yield results. Even with partial first or last names.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With