2017-08-04 187 views
0

我使用了一个scopeSearchLaravel scopeSearch雄辩

  • 我的模型:历史

公共职能scopeSearch($查询,$期)

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

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

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

如果用户搜索ID,我的范围搜索将起作用。我希望用户输入名称,而不是他们的ID,他们的历史记录将显示。

的问题是,只有在user_ID的“历史”

如何与这个雄辩的工作吗?

我已经尝试用修补程序输入奇怪的东西,并通过获取'用户'中的所有数据修改scopeSearch函数中的一点,但它没有工作。我在人际关系方面完全无力。对不起,如果我听起来贪婪。

[更新]我建议使用一个连接方法,我正在尝试它

+0

用户登录后使用此搜索?如果不是,你怎么知道用户是谁? – usrNotFound

+0

这是不必要的,这个scopeSearch只是根据用户输入的内容来过滤历史。你是否建议使用身份验证方法? – Explorace

回答

0

为什么不能简单地移动范围搜索到用户模型?

因为搜索查询是基于用户的表,你可以添加的历史关系在用户模式是这样的:

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; 
} 

或者如果你坚持用历史的模型,只是定义了它的关系:

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

和范围搜索功能:

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

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

希望能有所帮助。

+0

我试图展示用户的历史,但让我试试想 – Explorace

+0

试图移动它,它不像你想象的那么简单,需要考虑用户的关系...因为我使用HistoryController来显示那些历史..仍然搞乱查询和stucked .. – Explorace

+0

你的猜测是对的,我已经有: 用户有很多历史, 历史属于一个用户。 您的复杂查询运作良好。我从来没有见过这样的问题。在这之后,我会深入探讨问题。 非常感谢,你已经完成了我的解决单一功能的2天。 – Explorace

0

那么从您所提供的内容:

$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); 
} 
+0

是的,现在它只适用于基于user_id的搜索。我想在历史模型中访问user-> name,但只有user_id,但是我迷路了 – Explorace

+0

谢谢你的链接,虽然scopeSearch是一个预定义的函数,但你让我从恶梦中醒来。 – Explorace