I am Working on laravel 8 version. I have two Models
User, FriendList
were table structure is as following.
User
id | name | email | . . . . | is_individual -------------------------------------------------------- 180 | John | John@gg.com | . . . . | 1 181 | Bobby | Bobby@gg.com | . . . . | 0 192 | Hellen | Hellen@gg.com | . . . . | 0 253 | Jason | Jason@gg.com | . . . . | 1
FriendList
id | user_id | to_id ---------------------- 1 | 180 | 181 2 | 180 | 192 3 | 180 | 253 4 | 253 | 180
i want to search result from User but condition is like it should be in friendlist
and user should be individual (is_individual = 1
)
I have tried following but i wan improve this.
Controller
$user_id = Auth::user()->id; $friendIds = FriendList::getIndividulsFriendsIds( $user_id ); $search_result = User::whereIn('id', $friendIds) ->where(function ($query) use ($request) { $query->where('name', 'like', "%{$request->search}%") ->orWhere('email', 'like', "%{$request->search}%"); }) ->get();
FriendList
static function getIndividulsFriendsIds( $id ) { $user_id = self::where('to_id', $id)->pluck('user_id')->toArray(); $to_id = self::where('user_id', $id)->pluck('to_id')->toArray(); $userIds = array_unique( array_merge($user_id, $to_id) ); return User::where('is_individual', 1)->whereIn('id',$userIds)->pluck('id')->toArray(); }
Help me to improve this. Thanks
Advertisement
Answer
I Have found an alternate way using query as following
class MemberController extends Controller { const TYPE_INDIVIDUAL = 1; . . . public individualSearch( SearchUserRequest $request ){ $user_id = Auth::user()->id; $sql = "select * from users WHERE ( name like '%".$request->search."%' OR email like '%".$request->search."%' ) AND (users.id IN ( SELECT DISTINCT to_id FROM friend_lists WHERE friend_lists.user_id like ".$user_id.") OR users.id IN ( SELECT DISTINCT user_id FROM friend_lists WHERE friend_lists.to_id like ".$user_id.") ) AND users.is_individual = ".self::TYPE_INDIVIDUAL; $search_result = DB::select($sql); } }
Please do let me know if we still can improve this. Thanks