【问题标题】:How to conditionally choose which column to SELECT based on WHERE clause, in a single query?如何在单个查询中根据 WHERE 子句有条件地选择要选择的列?
【发布时间】:2017-09-16 01:49:50
【问题描述】:

这是场景。假设我有一个表Foo 有两列barbaz。我想检查barbaz 的条件。此条件仅适用于两列之一。无论哪一列是正确的,我都想选择另一列。

我可以把它写成两个单独的查询,像这样:

$one = Foo::select('bar as qux')->where('baz', $value);
$two = Foo::select('baz as qux')->where('bar', $value);

(为了便于说明,我的示例中的条件是检查列是否等于$value。)

在那之后,我想我可以得到两个查询的结果并将它们合并。但是,我真的很想使用Paginator,以及希望它成为单个查询的其他原因。

我可以使用以下方法从表中选择所有相关行:

$rows = Foo::where('baz', $value)->orWhere('bar', $value);

但是我不知道如何从那里有条件地选择barbaz。看来我寻求的解决方案将是上述两种方法的某种组合。

是否可以使用 Eloquent 在单个查询中执行此操作?我想我可以执行原始查询,但如果可能的话,我宁愿完全远离原始查询。谢谢。

【问题讨论】:

    标签: php mysql laravel orm eloquent


    【解决方案1】:

    难道你不能只使用 orWhere 查询,然后循环检查结果是否正确吗?

    $rows = Foo::where('baz', $value)->orWhere('bar', $value)->get();
    
    foreach($rows as $row) {
       $qux = ($row->bar == $value) ? $row->baz : $row->bar;
       // do something with $qux
    }
    

    如果您想更加以对象为中心,可以将属性 qux 映射到每一行:

    $rows = Foo::where('baz', $value)->orWhere('bar', $value)
        ->get()
        ->map(function($row) {
            $row->qux = ($row->bar == $value) ? $row->baz : $row->bar;
            return $row;
        });
    

    【讨论】:

    • 我对您的第一反应是说:我不想马上get() 结果,因为我想对它们进行分页。但后来我突然想到,我可以对orWhere 的结果进行分页并遍历它。谢谢,看来这是我想多了!
    猜你喜欢
    • 2016-01-23
    • 2017-11-23
    • 2013-09-04
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多