我已将Laravel Query Builder分配给变量。它在使用时会发生变化

时间:2017-08-08 15:43:38

标签: laravel query-builder builder laravel-query-builder

这是一个为什么问题,而不是如何:)

我已将查询投标分配给变量$ query:

$query = table::where(['id'=>1, 'this_version'=> 1]);
$versions['slug1'] = $query->select('tourist_id', 'tourist_version')->get()->toArray();
print_r($versions);

输出带有2个(!)子数组的数组:

Array
(
    [slug1] => Array
        (
            [0] => Array
                (
                    [tourist_id] => 1
                    [tourist_version] => 1
                )

            [1] => Array
                (
                    [tourist_id] => 2
                    [tourist_version] => 1
                )

        )

)

但是如果我在$ query声明和它在获取$ version [2]数组中的使用之间使用$ query添加另一行,我的$ version [2]输出将缩短为一维数组:< / p>

$query = previoustour2_tourist::where(['tour2_id'=>$tour->id, 'this_version'=> 1]);
// Added line:
$versions['slug0'] = $query->select('version_created')->first()->version_created;
//
$versions['slug1'] = $query->select('tourist_id', 'tourist_version')->get()->toArray();
print_r($versions);

输出(注意slug1现在只有1个嵌套数组):

Array
(
    [slug0] => 2017-08-08 08:25:26
    [slug1] => Array
        (
            [0] => Array
                (
                    [tourist_id] => 1
                    [tourist_version] => 1
                )

        )

)

看起来就像这一行:

$versions['slug0'] = $query->select('version_created')->first()->version_created;

已添加&#34; first()&#34;原始$查询的方法。我是对的,如果是的话,为什么会这样?

1 个答案:

答案 0 :(得分:1)

嗯,这是因为默认情况下,PHP中的对象(在您的情况下是Query构建器对象)是通过引用传递的。您可以在此处详细了解:PHP OOP References

我引用上面的参考文献:

  

PHP引用是一个别名,它允许两个不同的变量   写入相同的值。

当您将查询构建器对象传递给$query变量时,实际上只是将引用传递给此对象而不是它的副本。

$query = previoustour2_tourist::where(['tour2_id'=>$tour->id, 'this_version'=> 1]);

因此,当您在第二行调用first()方法时,它实际上会修改查询构建器对象。

$versions['slug0'] = $query->select('version_created')->first()->version_created;

因此导致即将发布的查询结果限制为1.为了解决此问题,您可以clone查询对象,如下所示:

$query = previoustour2_tourist::where(['tour2_id'=>$tour->id, 'this_version'=> 1]);
$versions['slug0'] = (clone $query)->select('version_created')->first()->version_created;
$versions['slug1'] = (clone $query)->select('tourist_id', 'tourist_version')->get()->toArray();
print_r($versions);

希望这有帮助!