搜索metable类型的laravel元表数据

问题描述 投票:0回答:1

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

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

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

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

元表

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 表连接不同

不知道如何,因为 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 中连接表格

这是我的新搜索查询

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);
}
laravel-5 eloquent polymorphic-associations
1个回答
0
投票

感谢上面的贡献,这些不足实际上促使我更加努力地阅读和思考,我终于遇到了如下所示的带有函数查询的

use()

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);
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.