【问题标题】:global variable not available to query constraint in laravel eager load全局变量不可用于 laravel 急切加载中的查询约束
【发布时间】:2016-06-15 19:15:46
【问题描述】:

我有一个需要传递给查询的全局变量:

$size = (user input)

$name = (user input)

$items = Items::with('color')->with(['size' => function ($query){

                $query->where('meters', '=', $size);
            }])

                ->where('item_name', '=', $name)
                ->get();

这个查询的问题是 $color 变量在闭包中不可用:我真的需要预先加载数据而不是加入表,因为我已经定义了一个在视图中使用的变量。 如何将该变量传递给闭包?

【问题讨论】:

    标签: php laravel eloquent load closures


    【解决方案1】:

    你只需将它传递给你的函数。

    $items = Items::with('color')->with(['size' => function ($query, $size) {
    
                $query->where('meters', '=', $size);
            }])
    
                ->where('item_name', '=', $text)
                ->get();
    

    【讨论】:

    • 不起作用,它会抛出这个错误:Missing argument 2 for App\Http\Controllers\ItemController::App\Http\Controllers\{closure}()
    • 哦,抱歉,我看错了代码。 $color 来自哪里或定义在哪里?
    • 不用担心颜色。我在编写问题中的代码时出错。我更新了它。我需要将 $size 传递给闭包
    • 如果已经定义了大小,那么您可以将其作为第一个答案传递给您的函数。如果它在其他地方被定义为全局,那么你应该在这个答案stackoverflow.com/questions/5449526/… 中声明它是全局的
    • 这个查询的问题是,如果米不等于 $size ,它也会返回数据 ...
    【解决方案2】:

    怎么样

    $size = '(size value)';
    $items = Items::with('color')
        ->whereHas('size', function ($query) use ($size) {
            $query->where('meters', $size);
        })
        ->where('item_name', $name)
        ->get();
    

    【讨论】:

    • 没有找到他的 size 列,这个没有 eagerLoad size
    • 等等,'size' 是关系还是 Items 中的列?
    • 在使用 whereHas 时,我从来不需要再 eagerLoad 关系。如果你做 Items::where('color', 'size') 怎么办?
    • 是的,正如我在您的回复中发布的那样,这是一种关系,因为尺寸可以不同(厘米、英寸、毫米等),所以用户有一个外国尺寸索引
    猜你喜欢
    • 2015-03-19
    • 2017-04-13
    • 2015-05-29
    • 1970-01-01
    • 2013-12-25
    • 2019-12-24
    • 2015-11-17
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多