Laravel雄辩或关系何处

时间:2018-07-21 04:03:07

标签: php laravel laravel-5 eloquent where

我有一个课程模型,其中有很多帮助模型。

public function helps() {
    return $this->hasMany(Help::class);
}

现在的问题是,当我尝试在某个地方和某个地方遇到问题的时候寻求某门课程的帮助时。

$helps = $course->helps()
    ->where(['from_id' => 497])->orWhere(['to_id' => 497])->get();

当我尝试获得课程1的帮助时,结果是正确的

"data": [
        {
            "id": 12,
            "message": "hi there",
            "from_id": 497,
            "to_id": 1,
            "course_id": 1,
        },
        {
            "id": 108,
            "message": "hi ...",
            "from_id": 1,
            "to_id": 497,
            "course_id": 1,
        },
        {
            "id": 197,
            "message": "ok body",
            "from_id": 1,
            "to_id": 497,
            "course_id": 1,
        }
    ]

但是,当我尝试从没有帮助的任何课程中获得帮助时,它会返回orWhere字段,而忽略了$course->helps()

,而不是空数组

这是课程2的结果,没有任何帮助:

"data": [
        {
            "id": 108,
            "message": "hi ...",
            "from_id": 1,
            "to_id": 497,
            "course_id": 1,
        },
        {
            "id": 197,
            "message": "ok body",
            "from_id": 1,
            "to_id": 497,
            "course_id": 1,
        }
    ]

2 个答案:

答案 0 :(得分:2)

问题是orWhere。为了生成正确的查询,您应该将条件包装到其他闭包中。

$helps = $course->helps()->where(function($q) {
    $q->where('from_id', 497)->orWhere('to_id', 497)
})->get();

用闭包包装在所需位置添加()。

现在,您将处于A AND (B OR C)所在的位置,并且在拥有A AND B OR C之前就拥有(A AND B) OR C的真正含义。

我还从where中删除了数组语法,以保持其整洁。

答案 1 :(得分:0)

尝试一下:

$helps = $course->helps->where('from_id', 497)->orWhere('to_id', 497);