正在搜索类型为 metable 的 laravel 元 table 的数据

Searching data of laravel meta table of type metable

我有 3 tables 用户、文章和元数据。我已经根据 laravel 5.3 文档定义了 morphTo() 和 morphToMany() 并且我可以提取元 table 中定义的用户或文章的任何特定 属性,例如名字或姓氏或坐标。

现在我很难编写正确的模型来搜索这些属性,例如搜索任何用户的名字或姓氏或两者。

<u>User table</u>
id.    username.    password
1.      Test.             Testpass

<u>article</>
id.   Title.                     Slug
1.     My article title.   my-article-title

元数据table

Id.     key.                value.                 metable_id    metable_type
1       firstname      Ade                     1                      App\User
2.      content.        Sample article   1.                     App\Article
3.      lastname.     Keon.                   1.                    App\User

Meta.php 提取

public function metable() {
    return $this->morphTo();
}

User.php 提取

public function meta() {
    return $this->morphToMany('App\User', 'metable');
}

public function getName() {
     $user = User::find($this->id);
     $metadata = $user->meta()->whereIn('key', ['firstname', 'lastname']) ;
     dd($metadata);
}

Article.php 提取

public function meta() {
    return $this->morphToMany('App\User', 'metable');
}

getName 函数按预期工作,但我不知道如何搜索用户元数据,这与传统的 php/mysql table 连接

不同

不知道 laravel 中的整个多态关系对我来说是新的,但我发现并使用了如下内容:

public function getSearch() {
      return User::with(array('metas' => function($query) { 
            $query->where('value', $query); 
      }));
 }

public function getSearch() {
         return User::with('metas') 
         ->whereHas('metas', function($query) { 
                $query->where('value', '=', $query); 
          });
   }

我看不到也无法理解如何加入 laravel

中的 table

这是我的新搜索查询

public function getResults(Request $request) {
    $keyword = $request->input('query');
    $filterOne = $request->input('minAge');
    $filterTwo = $request->input('maxAge');

    $query = User::with(['meta' => function ($q) {
        $q->where('value', 'like', $keyword)
            ->orWhere(function ($q) {
                $q->whereBetween('value', [$filterOne,$filtertwo]);
            });
    }])->get();

dd($query);
}

感谢楼上的贡献,不足之处反而让我更加努力的阅读和思考,终于遇到了use() with function query 如下图;

public function getResults(Request $request) {
        $keyword = $request->input('query');
        $filterOne = $request->input('minAge');
        $filterTwo = $request->input('maxAge');

        if (isset($keyword)) {
            $query = User::with(['meta' => function ($q) use ($keyword,$filterOne,$filterTwo) {
                $q->where('value', 'LIKE', $keyword)
                    ->whereBetween('value', [$filterOne, $filterTwo]);
            }])->get();
        } else {
            $query = User::with(['meta' => function ($q) use ($filterOne,$filterTwo) {
                $q->whereBetween('value', [$filterOne, $filterTwo]);
            }])->get();
        }

        dd($query);
    }

这给了我正在寻找的结果;虽然我不确定在处理大型数据集时对性能的影响,但我想那是我的下一个任务。