basharqarat/simsearch

该软件包最新版本(v1.0.0)没有提供许可证信息。

v1.0.0 2023-05-15 09:17 UTC

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