【问题标题】:How to get different queries (models) results with one statement? - laravel如何用一个语句获得不同的查询(模型)结果? - 拉拉维尔
【发布时间】:2015-10-07 12:27:49
【问题描述】:

对不起,如果我的标题令人困惑,不知道如何在一行中解释这一点。假设我有一个包含一些列的表,并且我有这个

$model = Document::where('systemName', '=', $systemName)->where('ticketNumber', '=', ($nextTicketNumber))->get(); ticketNumber is unique where as there are quite a few systemNames

以上将得到我想要的,但我想要更多。我想要一个将所有行存储在同一系统名称下的另一个数组。我知道我可以这样做

$allSystemNameModel = Document::where('systemName', '=', $systemName)

但是有没有一种可能的方法可以不使用两个变量并且更容易?

【问题讨论】:

    标签: php database laravel model eloquent


    【解决方案1】:

    不,您不能通过一个语句将两个集合放入一个变量中,但是,您可以创建一个数组并将结果存储在那里:

    $both = [];
    $both['model'] = ...
    $both['all'] = ...
    

    更新:

    为了避免两次查询数据库,可以使用 laravel 提供给我们的first 方法。

    $allSystemNameModel = Document::where('systemName', '=', $systemName);
    
    $model = $allSystemNameModel->first(function ($doc) use ($nextTicketNumber) {
        return $doc->ticketNumber == $nextTicketNumber;
    });
    
    $both['model'] = $model;
    $both['all'] = $allSystemNameModel->all();
    

    注意:使用 php 闭包时请务必使用 use,否则 $nextTicketNumber 将是未定义的。

    【讨论】:

    • 啊好吧....我想因为这两个查询都与systemName 的列相关,并且因为$allSystemNameModel 提取了所有可能无法使用的具有相同“系统名称”的行$allSystemNameModel 中的该数组以获得所需的确切行,因此代码不必两次进入数据库
    • @Dora,我可以理解不想在不必要的情况下查询数据库两次。幸运的是,laravel 通过集合为我们解决了这个问题。您将查询systemName 组,然后过滤以匹配票号。 laravel.com/docs/5.1/collections#method-filter
    • @Dora,我已经更新了我的答案,因为我更好地理解了你的目的。
    • 好的~谢谢。对不起,我有不好的解释。让我试试这个,但我拥有的 laravel 版本是 4.2。希望它不只是在 5.1 中,因为我当时在想也许我可以为$allSystemNameModel 做一个foreach 并循环查找匹配的$nextTicketNumber,但还没有时间尝试一下
    • 是的,它会像你建议的那样在 foreach 中工作。当然,这就是 first() 在幕后发生的事情。希望你能尽快升级 =)
    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2018-03-13
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多