【问题标题】:Laravel conditional queryLaravel 条件查询
【发布时间】:2020-10-11 11:27:42
【问题描述】:

我有一个函数,我尝试在 2 列中搜索匹配的 id,但它始终返回 true,即使实际上没有结果。

我想搜索用户以前的关系,但不知道如何实现这个逻辑。

逻辑

  1. 我的表有 2 列 from_idto_id(都将获取用户 ID)
  2. 我正在向后端发送 2 个 ID(一个作为输入,另一个作为请求 标题)
  3. 我想说:where 输入idfrom_id 并且header id 是 to_id , ORwhere 输入idto_id 并且标头idfrom_id 返回结果,否则显然为null。

代码

public function check(Request $request) { // always return true!
        $user = $request->user();
        $userInput = $request->input('receiverId');
        $chat = PrivateChat::where(function ($query) use ($user) {
            $query->where('from_id', $user->id)->orWhere('to_id', $user->id);
        })->orWhere(function ($query) use ($userInput) {
            $query->where('from_id', $userInput)->orWhere('to_id', $userInput);
        })->first();

        $receiver = User::where('id', $request->input('receiverId'))->first();

        if($chat) {
            return response()->json([
                'data' => new PrivateChatResource($chat),
                'exist' => true,
                'receiver' => new UserResource($receiver),
                'message' => 'Chat data retrieved successfully.'
            ]);
        } else {
            return response()->json([
                'exist' => false,
                'receiver' => new UserResource($receiver),
                'message' => 'Chat data retrieved successfully.'
            ]);
        }
}

注意:这是我的older question 的后续。

知道是什么问题吗?

更新

基于Giacomo M 的评论,我认为这应该是最终代码

$chat = PrivateChat::where(function ($query) use ($user, $userInput) {
            $query
                ->where('from_id', $user->id)
                ->where('to_id', $userInput);
        })->orWhere(function ($query) use ($user, $userInput) {
            $query
                ->where('from_id', $userInput)
                ->where('to_id', $user->id);
        })->first();

有意义吗?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您也在子查询中使用orWhere,但根据您的逻辑,您需要在子查询中进行 AND。

    您的查询变为:

    $chat = PrivateChat::where(function ($query) use ($user) {
        $query
            ->where('from_id', $user->id)
            ->where('to_id', $user->id); // where, NOT orWhere
    })->orWhere(function ($query) use ($userInput) {
        $query
            ->where('from_id', $userInput)
            ->where('to_id', $userInput); // where, NOT orWhere
    })->first();
    

    【讨论】:

    • 很好,我认为他们还需要在每组中使用$userInput$user->id,而不仅仅是每个组中的一组
    • 我认为问题是您对>where('from_id', $userInput) | ->where('to_id', $userInput)->where('from_id', $user->id) | ->where('to_id', $user->id) 两列都使用相同的ID
    • 不应该像->where('from_id', $user->id) | ->where('to_id', $userInput)
    猜你喜欢
    • 2020-09-19
    • 2015-05-01
    • 2016-11-06
    • 2021-09-18
    • 2014-10-04
    • 2018-06-27
    • 2021-12-21
    • 2015-02-26
    • 2017-04-24
    相关资源
    最近更新 更多