basharqarat / simsearch
This package is not auto-updated.
Last update: 2024-09-30 18:01:00 UTC
README
动态简单搜索
安装
composer require basharqarat/simsearch
用法
让我们谈谈函数签名和响应
Model::search($var1,$var2,$var3,$var4);
$var1(必需): 是我们要搜索的字符串。
$var2(可选): 是我们想要在其中搜索的关系模型数组,如果为空 => 函数将忽略它。
$var3(可选): 是字符串数组(如果我们要在定义的列中搜索),如果为空 => 函数将忽略它。
$var4(可选): 是表达式数组的键
response: 模型数据集合,或空数组。
在模型中的用法
安装后。
在你想要搜索的模型中
use BasharQarat\Simsearch\Traits\Searchable;
class User extends Authenticatable
{
use Searchable;
public $mySearchableFields = [
'name',
'fname',
'lname',
'phone_code',
'phone_number'
'email',
];
/**
* return array
*/
public function getSearchableFields(){
return array_merge($this->mySearchableFields,
[
\DB::raw('CONCAT(phone_code," ",phone_number)'),
\DB::raw('CONCAT(fname," ",lname)')
];
);
}
}
1- 使用可搜索特性。
2- 添加 $mySearchableFields 数组,并将其中的列名放入其中,你希望在动态上搜索它。
3- 如果你想要在你的字段中使用表达式(如(concat(fname,'',lname)),则应在模型中使用 getSearchableFields() 函数,如前面的示例。
4- 现在,你可以在代码中使用它了。
逻辑
在相同模型中搜索
初始化模型后。
1- 这将在 $mySearchableFields 数组中的所有列中搜索用户模型。
User::search($search_key)
->get();
但如果我们想每次都搜索定义的列呢?你可以这样做。
2- 这将在名称列中搜索用户模型,并忽略 $mySearchableFields。
User::search($search_key,[],['name',...])
->get();
3- 如果你想在定义的查询中使用表达式,你应该在字段数组中使用未在模型中声明的唯一名称(如(full_name)),并传递表达式数组参数,并将新声明的名称作为键,其值为表达式。
User::search($search_key,[],['full_name'],['full_name'=>\DB::raw('CONCAT(fname," ",lname)')])
->get();
也在关联中搜索
首先,你应该在模型中有关系函数,并在你想要在其中搜索的所有模型中使用可搜索特性。
class User extends Authenticatable
{
use Searchable;
public $mySearchableFields = [
'name',
'email',
];
public function UserTypes(){
return $this->hasMany('App\Models\UserType');
}
}
class UserType extends Model
{
use Searchable;
public $mySearchableFields = [
'type',
];
public function User(){
return $this->belongsTo('App\Models\User');
}
}
然后你可以这样使用它:
1- 在用户模型及其相关用户类型记录中搜索
User::search($search_key,['UserTypes'])
->get();
2- 在关联中搜索定义的列
User::search($search_key,['UserTypes:type'])
->get();
并且我们仍然可以从用户模型中搜索定义的列
User::search($search_key,['UserTypes:type'],['name'])
->get();
或者我们可以这样写
User::search($search_key,[],['name','UserTypes.type'])
->get();
如果我们想搜索多个定义的列呢?所以...
User::search($search_key,['UserTypes:type,id'])
->get();
或者
User::search($search_key,[],['name','UserTypes.[type,id]'])
->get();
(当我们想在同一模型中放入关系时,字段数组必须以这种方式[对于定义的列])
在嵌套关联中
如果我们想在嵌套关联中搜索并从一个模型传递到另一个模型呢?所以..
1- 这将在用户模型、用户类型模型和 RelationNameRelatedToUserTypeModel 模型中搜索,取决于用户模型中的名称列和它们的模型中的 $mySearchableFields 数组。(但以这种方式,用户模型应该有 UserTypes() 函数,用户类型模型应该在其内部有 RelationNameRelatedToUserTypeModel() 函数)
User::search($search_key,['UserTypes.RelationNameRelatedToUserTypeModel'],['name'])
->get();
2- 与此类似
User::search($search_key,['UserTypes.RelationNameRelatedToUserTypeModel.AnotherOneRelated_to_the_previous_RelationNameRelatedToUserTypeModel'],['name'])
->get();
3- 如果你想在两个或更多与同一模型相关联的关联中进行搜索
User::search($search_key,['UserTypes'=>['firstRelationRelatedToUserTypesModel','secondRelationRelatedToUserTypesModel',..]])
->get();
并且我们仍然使用所有 AnotherOneRelated_to_the_previous_RelationNameRelatedToUserTypeModel 的定义列
User::search($search_key,['UserTypes:type'=>['firstRelationRelatedToUserTypesModel:firstColumnName,secondColumnName','secondRelationRelatedToUserTypesModel',..]])
->get();
4- 我们可以将这两种嵌套关联类型一起使用
User::search($search_key,['UserTypes.RelationInsideUserTypes'=>['firstRelationRelatedToRelationInsideUserTypesModel','secondRelationRelatedToRelationInsideUserTypesModel',..]])
->get();
#注意我们可以在所有前面的状态下使用关系表达式
User::search($search_key,['UserTypes:expression_name'],[],['expression_name'=>\DB::raw('any expression here...')])
->get();
支持
联系邮箱:bkbesho@gmail.com