我已将Laravel查询生成器分配给一个变量。使用时会改变

Ser*_*min 2 builder query-builder laravel 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

        )

)
Run Code Online (Sandbox Code Playgroud)

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

$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);
Run Code Online (Sandbox Code Playgroud)

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

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

        )

)
Run Code Online (Sandbox Code Playgroud)

好像是这样的:

$versions['slug0'] = $query->select('version_created')->first()->version_created;
Run Code Online (Sandbox Code Playgroud)

已在原始$ query中添加了“ first()”方法。我是对的,如果是的话,为什么会发生?

Ris*_*ana 5

好吧,这是因为默认情况下,PHP中的一个对象(在您的情况下是“查询”构建器对象)是通过引用传递的。您可以在此处阅读有关此内容的更多信息:PHP OOP References

我引用上面的参考:

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

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

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

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

$versions['slug0'] = $query->select('version_created')->first()->version_created;
Run Code Online (Sandbox Code Playgroud)

因此,导致即将到来的查询结果被限制为1。为了解决此问题,您可以克隆查询对象,如下所示:

$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);
Run Code Online (Sandbox Code Playgroud)

希望有帮助!