Laravel eloquent 搜索名称关系
Laravel eloquent search for name relation
好吧,我有点卡住了。
我在我的项目中创建了一个组系统。
群系统为5款:
- 组
- 组别
- 群组成员
- 群发
- 群发评论
我想做的是通过用户名输入搜索组中的成员。
但是我只将 user_id 存储在 GroupMember 模型中,而不是存储在 User 模型中的用户名。我还没有与用户模型中的组有任何关系。
我必须输入某种关系吗?
Morph关系我还没搞明白
这里列出了一些需要模型的组的关系。
群模型
public function category() {
return $this -> belongsTo('App\GroupCategory', 'category_id');
}
public function owner() {
return $this -> hasOne('App\GroupMember', 'group_id') -> where('owner', true);
}
public function mods() {
return $this -> hasMany('App\GroupMember', 'group_id') -> where('mod', true);
}
public function members() {
return $this -> hasMany('App\GroupMember', 'group_id');
}
public function posts() {
return $this -> hasMany('App\GroupPost', 'group_id');
}
public function comments() {
return $this -> hasMany('App\GroupPostComment', 'group_id');
}
群组成员模型
public function groups() {
return $this -> belongsToMany('App\Group');
}
public function posts() {
return $this -> hasMany('App\GroupPost');
}
public function comments() {
return $this -> hasMany('App\GroupPostComment');
}
public function user() {
return $this -> belongsTo('App\User');
}
澄清一下。我有一个输入字段,管理员可以在其中输入他要查找的字母或用户名的一部分,然后进行 AJAX 搜索,只查找组中的成员,但它按用户名查找。而username不在GroupMember模型中,而是在User模型中。
我该怎么做?
提前致谢。
编辑:控制器方法。
/**
* @param Group $group
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*
* Manage users
*/
public function getManageUsers(Group $group) {
$group = $group -> with('members.user');
// Usernames can be "test0", "test1", "test2"
// If i search "1" only "test1" should be in the result
$yourSearchQuery = '1';
// The query
$result = $group -> whereHas('members', function ($query) use ($yourSearchQuery) {
$query -> whereHas('user', function ($query) use ($yourSearchQuery) {
$query -> where('name', 'LIKE', '%'. $yourSearchQuery .'%');
});
}) -> get();
// Check the results manually
// It still returns all members of the group
dd($result);
}
您可以通过关系获取数据,例如尝试此代码:
$group = Group::first();
return $group->members->user
别忘了:
use (namespace of group model)
搜索:
$yourSearchQuery - 字符串我们必须找到的内容
$group = Group::with('members.user');
$result = $group -> whereHas('members', function ($query) use ($yourSearchQuery) {
$query -> whereHas('user', function ($query) use ($yourSearchQuery) {
$query->where('name', 'LIKE', '%'. $yourSearchQuery .'%');
}
})->get();
所以我终于修好了!
只需要稍微修改一下 Odin Thunder 的答案。
这是有效的查询。
$result = $group -> members() -> whereHas('user', function($query) use($q) {
$query -> where('name', 'LIKE', '%'. $q .'%');
}) -> get();
好吧,我有点卡住了。 我在我的项目中创建了一个组系统。 群系统为5款:
- 组
- 组别
- 群组成员
- 群发
- 群发评论
我想做的是通过用户名输入搜索组中的成员。 但是我只将 user_id 存储在 GroupMember 模型中,而不是存储在 User 模型中的用户名。我还没有与用户模型中的组有任何关系。
我必须输入某种关系吗? Morph关系我还没搞明白
这里列出了一些需要模型的组的关系。
群模型
public function category() {
return $this -> belongsTo('App\GroupCategory', 'category_id');
}
public function owner() {
return $this -> hasOne('App\GroupMember', 'group_id') -> where('owner', true);
}
public function mods() {
return $this -> hasMany('App\GroupMember', 'group_id') -> where('mod', true);
}
public function members() {
return $this -> hasMany('App\GroupMember', 'group_id');
}
public function posts() {
return $this -> hasMany('App\GroupPost', 'group_id');
}
public function comments() {
return $this -> hasMany('App\GroupPostComment', 'group_id');
}
群组成员模型
public function groups() {
return $this -> belongsToMany('App\Group');
}
public function posts() {
return $this -> hasMany('App\GroupPost');
}
public function comments() {
return $this -> hasMany('App\GroupPostComment');
}
public function user() {
return $this -> belongsTo('App\User');
}
澄清一下。我有一个输入字段,管理员可以在其中输入他要查找的字母或用户名的一部分,然后进行 AJAX 搜索,只查找组中的成员,但它按用户名查找。而username不在GroupMember模型中,而是在User模型中。
我该怎么做?
提前致谢。
编辑:控制器方法。
/**
* @param Group $group
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*
* Manage users
*/
public function getManageUsers(Group $group) {
$group = $group -> with('members.user');
// Usernames can be "test0", "test1", "test2"
// If i search "1" only "test1" should be in the result
$yourSearchQuery = '1';
// The query
$result = $group -> whereHas('members', function ($query) use ($yourSearchQuery) {
$query -> whereHas('user', function ($query) use ($yourSearchQuery) {
$query -> where('name', 'LIKE', '%'. $yourSearchQuery .'%');
});
}) -> get();
// Check the results manually
// It still returns all members of the group
dd($result);
}
您可以通过关系获取数据,例如尝试此代码:
$group = Group::first();
return $group->members->user
别忘了:
use (namespace of group model)
搜索:
$yourSearchQuery - 字符串我们必须找到的内容
$group = Group::with('members.user');
$result = $group -> whereHas('members', function ($query) use ($yourSearchQuery) {
$query -> whereHas('user', function ($query) use ($yourSearchQuery) {
$query->where('name', 'LIKE', '%'. $yourSearchQuery .'%');
}
})->get();
所以我终于修好了! 只需要稍微修改一下 Odin Thunder 的答案。
这是有效的查询。
$result = $group -> members() -> whereHas('user', function($query) use($q) {
$query -> where('name', 'LIKE', '%'. $q .'%');
}) -> get();