我有两个模型User和Friend, User在Friend (user_id)中有一个外键,因为它是一个HasMany关系,所以我添加了一个函数,返回当前用户的友谊
public static function searchFriend(){
return Friend::whereUserId(Auth::id())
->orWhere('friend_id',Auth::id())->get();
}
现在我想通过firstname搜索当前用户的朋友,所以我必须通过外键user_id或friend_id和firstname查询他的友谊和对相关用户的访问,我如何才能对searchFriend()函数返回的结果应用查询
$friends = Friend::searchFriend();
添加关系了吗?
public function friends() {
return $this->hasMany(Friend:class);
}
那么你可以简单地做$user->friends()->where(‘first_name’, ‘John’)->get();
try this,
朋友模型:-
public function user(){
return $this->belongsTo('AppUser','user_id');
}
use IlluminateSupportFacadesAuth;
$first_name = $request->first_name ?? "";
$friends = Friend::whereHas('user',function($q){
$q->where('id',Auth::id());
})->where("first_name","=","%{$first_name}%")->get();
对当前代码库进行最小更改的解决方案是从searchFriend()函数中删除get()调用,并将where语句移动到闭包中(更多信息在这里):
public static function searchFriend(){
return Friend::where(function ($query) {
$query->where('user_id',Auth::id())
->orWhere('friend_id',Auth::id());
}
}
由于"and"结果查询的优先级。点击这里阅读。
像这样使用:$friends = Friend::searchFriend()->where('firstname','John')->get();
这个解决方案应该可以工作,但我建议您将函数更改为如下内容:
User.php
public function friends(){
return Friend::where(function ($query) {
$query->where('user_id',$this->id())
->orWhere('friend_id',$this->id());
}
}
像这样搜索你的名字:$friends = $request->user()->friends()->where('firstname','John')->get()