Laravel'where'收集方法修改了集合

时间:2016-04-18 13:32:31

标签: laravel laravel-5 laravel-5.2 laravel-collection

Laravel where 收集方法是否会修改集合?

Laravel documentation上,您可以阅读:

  

几乎每个方法都返回一个新的Collection实例,允许您保留集合的原始副本

唯一有关于修改集合的警告的方法是transformforget

但我有这段代码:

    $descriptions = Description::where('description', $request->description);

    if ($descriptions->count()) {
        $descriptionsWithSameUnit = $descriptions->where('unit_id', $request->unit);
        if ($descriptionsWithSameUnit->count()==0) {
            $descriptionsWithAnotherUnit = $descriptions->where('unit_id', '!=', $request->unit);
            if ($descriptionsWithAnotherUnit->count()) {
        ...

并且在第一个地方之后修改了集合,因此$descriptionsWithAnotherUnit始终为空,因为在该点上集合仅具有unit_id == $request->unit的记录。这是框架或文档中的错误吗?

此处出现的问题:如果不从数据库中再次检索,我该怎么做才能保留原始对象的副本?我试过这个:

$descriptions = Description::where('description', $request->description);

if ($descriptions->count()) {
    $descriptionsWithSameUnit = $descriptions;
    $descriptionsWithSameUnit->where('unit_id', $request->unit);
    ...

但是,当我将$descriptions方法应用于where对象时,$descriptionsWithSameUnit对象也会被修改

1 个答案:

答案 0 :(得分:1)

首先要获得收藏,你需要使用get,所以如果你想获得收藏,你应该这样做:

$descriptions = Description::where('description', $request->description)->get();

而不仅仅是:

$descriptions = Description::where('description', $request->description);

第二件事是,在收集时不可能使用where method运算符,所以:

$descriptionsWithAnotherUnit = $descriptions->where('unit_id', '!=', $request->unit);

完全不正确。你应该在这里使用filter方法。