【问题标题】:Laravel scopeSearch EloquentLaravel 范围搜索 Eloquent
【发布时间】:2021-04-10 09:13:14
【问题描述】:

我使用了范围搜索

  • 我的模型:历史

公共函数 scopeSearch($query, $term)

    $result = $query->where('user_id', 'like', '%' .$term. '%');
    return result; 

我在历史视图中使用了一个搜索栏,用户可以输入他们的ID,如果有与历史相关的ID,它将显示他们的历史。

tables:
'users' - columns: name, ...
'histories' -columns: user_id, ...

如果用户搜索 ID,我的 scopeSearch 会起作用。我希望用户输入姓名,而不是显示他们的 ID 和他们的历史记录。

问题是“历史记录”中只有 user_id

我如何使用这个 Eloquent?

我尝试使用 tinker 输入奇怪的东西,并通过获取“用户”中的所有数据在 scopeSearch 函数中进行了一些修改,但它没有用。我在人际关系中完全虚弱。对不起,如果我听起来很贪婪。

[更新]有人建议我使用join方法,我正在尝试中

【问题讨论】:

  • 用户登录后是否使用此搜索?如果不是,你怎么知道用户是谁?
  • 这不是必须的,这个范围搜索只是根据用户输入的内容过滤历史。您是否建议使用身份验证方法?

标签: php laravel eloquent


【解决方案1】:

为什么不简单地将 scopeSearch 移到 User 模型中?

由于搜索查询是基于 users 表的,您可以像这样在 User 模型中添加历史关系:

public function histories(){ 
return $this->hasMany('App\History'); // depending on the namespace of the History model.
}

所以,在 HistoryController 中,你可以放:

public function search($user_name){
$result = User::search($user_name)->with('histories')->get();
return $result;
}

或者如果你坚持使用 History 模型,只需在其中定义关系:

public function user(){
return $this->belongsTo('\App\User');}

还有scopeSearch函数:

public function scopeSearch($query, $term){
    return $query->whereHas('user', function($q) use($term){
        $q->where('name', 'like' , '%'.$term.'%');
    })->with('user')->get();
}

注意:我不知道历史和用户表之间关系的性质。我只是建议一个用户有很多历史,而历史属于一个用户。 如果不是这种情况,只需将模型中的关系类型更改为适当的。

希望能有所帮助。

【讨论】:

  • 我正在尝试显示用户的历史记录,但让我尝试考虑一下
  • 试过移动它,它不像你想象的那么简单,需要考虑用户的关系......因为我正在使用 HistoryController 来显示那些历史......仍然搞乱查询并卡住..
  • 你的猜测是对的,我已经有了:用户有很多历史,历史属于一个用户。您的复杂查询运行良好。我从未见过这样的查询。在此之后,我将更深入地研究查询。非常感谢,你已经结束了我2天的单个函数求解。
【解决方案2】:

从你提供的内容来看:

$result = $query->where('user_id', 'like', '%' .$term. '%');
return result; 

你总是会搜索user_id,所以当然它只会在有人输入id时返回一些东西。

查看此处了解查询范围:

https://laravel.com/docs/5.0/eloquent#query-scopes

但您的历史模型中似乎需要这样的东西:

public function scopeOfType($query, $type)
{
    return $query->whereType($type);
}

【讨论】:

  • 是的,现在它只适用于基于 user_id 的搜索。我想访问历史模型中的用户->名称,而其中只有 user_id,但我迷路了
  • 谢谢你的链接,虽然 scopeSearch 是一个预定义的功能,但你把我从噩梦中唤醒了。
猜你喜欢
  • 2017-08-28
  • 2018-12-30
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2018-09-08
相关资源
最近更新 更多