我有3个表用户,文章和元数据。我根据laravel 5.3 doc定义了morphTo()和morphToMany(),我可以提取metas表中定义的用户或文章的任何特定属性,例如firstname或lastname或coordinate。
现在我在编写正确的模型以搜索这些属性时遇到困难,例如搜索任何用户的名字或姓氏或两者。
<u>User table</u>
id. username. password
1. Test. Testpass
<u>article</>
id. Title. Slug
1. My article title. my-article-title
Metas表
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 extract
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 extract
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);
}
答案 0 :(得分: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);
}
这给了我正在寻找的结果;虽然我不确定在处理大型数据集时对性能的影响但我认为这是我的下一个任务。