【问题标题】:Laravel/Eloquent - Using dynamic properties in a multi-field search formLaravel/Eloquent - 在多字段搜索表单中使用动态属性
【发布时间】:2014-06-28 23:25:34
【问题描述】:

我的 Laravel 应用中有一个搜索表单,用于搜索属性列表。我的属性表已经有一个模型,并且通过一对多的关系连接到另一个称为详细信息的模型/表,其中包含某个属性是否有花园、车库等内容。在进行索引或显示内容时,这工作正常 - 我可以使用 $property->details 获取属性的详细信息。

搜索表单有一个字段,用户可以在其中搜索此类详细信息,这就是我苦苦挣扎的地方。我不仅需要找到详细信息本身,我还需要首先查看输入中存在的任何内容是否与详细信息表中的任何内容匹配,然后查看外键(称为 prop_id)是否与我的任何属性 id 匹配,然后包括那些结果中的属性。比如:

    $query = Property::where('archived',0);

    $query->details->where('text',$keyword);

    $results = $query->get();

这不起作用的原因是因为 details 不是 $query 的属性,但我不确定使用什么作为替代方法,因为再次调用 Property::where() 肯定会重置整个查询。我将它全部存储在 $query 变量中,因为我的表单中的所有字段都是可选的,所以我只基于具有值的输入来构建查询。

这里有点难过,所以如果有人已经解决了这样的问题,我们将不胜感激。干杯!

【问题讨论】:

    标签: php dynamic properties laravel eloquent


    【解决方案1】:

    你可以试试这样的:

    $query = Property::where('archived', 0);
    if(isset($keyword)) {
        $query->whereHas('details', function ($q) use ($keyword) {
            $q->where('text', $keyword);
        });
    }
    $results = $query->get();
    

    【讨论】:

    • 我正要编辑我的 OP 几乎以这个为例 - 这实际上正是最终对我有用的,因为我需要遍历潜在值并添加到 $query 变量而不是重新铸造它。干杯!
    【解决方案2】:

    使用whereHas:

    $query = Property::where('archived', 0)->whereHas('details', function ($q) use ($keyword)
    {
        $q->where('text', $keyword);
    });
    
    $results = $query->get();
    

    【讨论】:

    • 嘿约瑟夫,我之前确实对 whereHas 方法有所了解,但无济于事。原来这是我缺少的'use($keyword)'位,以正确地将值传递给函数。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多