我有 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);
}
感谢上面的贡献,这些不足实际上促使我更加努力地阅读和思考,我终于遇到了如下所示的带有函数查询的
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);
}
这给了我我正在寻找的结果;虽然我不确定处理大型数据集时对性能的影响,但我想这是我的下一个任务。