好的,所以我有点卡住了。 我在我的项目中创建了一个组系统。 小组系统有5个型号:
我要做的是通过用户名输入搜索组中的成员。 但我只将user_id存储在GroupMember模型中,而不是存储在User模型中的用户名。我与用户模型中的组没有任何关系。
我必须加入某种关系吗? 我还没有理解变形关系。
以下列出了该集团所需的一些模型的关系。
群组模型
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');
}
GroupMember模型
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搜索,它只查找组中的成员,但它按用户名查找。用户名不在GroupMember模型中,而是在用户模型中。
我该怎么做?
提前致谢。
编辑:控制器方法。
/**
* @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);
}
答案 0 :(得分:4)
所以我终于解决了! 只需要修改一下Odin Thunder的答案。
这是有效的查询。
$result = $group -> members() -> whereHas('user', function($query) use($q) {
$query -> where('name', 'LIKE', '%'. $q .'%');
}) -> get();
答案 1 :(得分:1)
您可以通过关系获取数据,例如尝试此代码:
$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();