在Laravel中预先搜索JSON列类型并使用WHEN方法
作为常规程序员,高级搜索是您不时遇到的事情。 我最近在Laravel中实现了它。 我要在这里解释。
先决条件-假设您确实具有Laravel Architecture及其功能(例如模型,控制器和路由的工作方式)的基础知识。
好的,我们确实有一个生物数据表,因为名称代表它保存了用户的生物数据。 这就是它的迁移方式
Migration
$table->id();
$table->enum('gender',['boy','girl']);
$table->string('name',255);
$table->json('biodata');
$table->timestamps();
如您所见,我们确实有一个表列生物数据,它是JSON类型。 这使我们可以将JSON保存在数据库中。
并且我们将使用属性强制转换在获取时将其自动转换为对象。 所以我们的生物数据模型看起来像这样
Model
namespace App;
use Illuminate\Database\Eloquent\Model;
class Biodata extends Model
{
protected $guarded = [];
protected $casts = [
'biodata' => object
];
protected $perPage = 10;
}
现在,在进一步介绍之前,先看看我们的生物数据对象是什么样子
Factory
return [
'gender' => $this->faker->randomElement($this->gender),
'name'=> $this->faker->name(),
'biodata' => [
'personal'=>[
'qualification' => $this->faker->randomElement($this->qualification),
'height'=>$this->faker->randomElement($this->height),
'income'=>$this->faker->numberBetween(100000,1000000),
'occupation' => $this->faker->randomElement($this->jobs),
],
'family'=>[
'father_gotra' => $this->faker->randomElement($this->gotra),
'mother_gotra' => $this->faker->randomElement($this->gotra),
],
'contact'=>[
'state' => $this->faker->randomElement($this->indianStates),
]
],
];
在所有这些字段上,我们将进行搜索。现在该讨论我们想从搜索功能中获得什么。 所以这是我们所有可选的搜索参数
Gender:单值 , 字段类型-ENUM
Qualification:可能是多个值, 字段类型-JSON密钥
Min Height:单值 , 字段类型-JSON密钥
Income:单值 , 字段类型-JSON密钥
Occupation:单值 , 字段类型-JSON密钥
Gotra:多重价值 , 字段类型-JSON密钥
现在,这对您来说似乎很简单,您只需要在where语句中使用,就可以了,但是请紧紧抓住,然后让我们先解决一些明显的问题
在JSON字段中搜索?
那么我们如何在JSON中搜索呢? 很显然,这对于MYSQL来说并不难,对于Laravel来说甚至更好,简而言之,这是您在JSON字段中进行搜索的方式,前提是它的密钥
return $query->where('biodata->personal->income', '>=', $minIncome);
检查上面的生物数据对象以了解。
多个值
现在,在进入编写搜索功能的代码之前,您可能要问的一个问题是如何在查询字符串中发送多个值? 很高兴您提出要求,我们只会将它们添加这样的逗号
http:://url.com/?qualification=MBA,BA&gender=boy
现在,我们可以简单地使用“,”将其爆炸,这将为我们提供该参数的值数组。
如何将多个查询添加到where语句?
所以这是Laravel文档声明的标准
DB::table('users')->where('votes', 100)->get();
或者 最好这么写
$users = DB::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();
您可以在此处向where语句添加多个参数,
但是,在实际跳至运行任何查询之前,我们需要进行某种验证。由于所有参数都是可选的,因此用户可能不会提供要添加到查询中的全部或任何输入。
因此,当我们在寻找地点和地点时,我们需要编写额外的代码来拯救我们。 这就是官方文件所说的
有时,您可能希望子句仅在其他情况成立时才应用于查询。 例如,如果传入请求中存在给定的输入值,则您可能只想应用where语句。 您可以使用when方法完成此操作:
这就是你写的方式
$users = DB::table('users')
->when($role, function ($query, $role) {
return $query->where('role_id', $role);
})
->get();
但是我们还有一个问题,我们如何为同一个参数添加多个值,那么when是函数的第二个参数,我们可以在该函数中执行任何操作:)继续阅读
因此,为了检查同一参数的多个值,我们将在其中使用循环,这就是它的样子。
->when($gotra, function ($query, $gotra) {
foreach($gotra as $g){
$query->where('biodata->family->father_gotra', '<>' ,$g);
}
return $query;
})
就是这样了。 我们介绍了编写搜索功能所需的所有基础知识。 编写的demo:
public function search(){
$gender = request('gender');
$state = request('state');
$minIncome = (int)request('minIncome');
$minHeight = (int)request('minHeight');
$qualifications = request('qualification') != '' ? explode(",", request('qualification') ) : false;
$gotra = request('gotra') != '' ? explode(",", request('gotra') ) : false;
$results = Biodata::
when($gender, function ($query, $gender) {
return $query->where('gender', $gender);
})
->when($state, function ($query, $state) {
return $query->where('biodata->contact->state', $state);
})
->when($qualifications, function ($query, $minQualification) {
foreach($qualifications as $qualification){
$query->where('biodata->personal->qualification', '=', $qualification);
}
return $query;
})
->when($minIncome, function ($query, $minIncome) {
return $query->where('biodata->personal->income', '>=', $minIncome);
})
->when($minHeight, function ($query, $minHeight) {
return $query->where('biodata->personal->height', '>=' , $minHeight);
})
->when($gotra, function ($query, $gotra) {
foreach($gotra as $g){
$query->where('biodata->family->father_gotra', '<>' ,$g);
}
return $query;
})
->paginate(10);
return response($results,200);
在开发此程序时,我遵循了TDD方法,因此我首先创建了测试,让我知道是否有人要检出它们。 给我发送消息,我将分享代码。
因此,今天我将把这个问题留给你们,让我知道您的想法。
转:https://dev.to/jiteshdhamaniya/advance-searching-in-laravel-for-json-column-type-and-when-method-3dp2
相关文章