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

I've assigned Laravel Query Builder to a variable. It changes when being used

这是一个 WHY 问题,而不是 How-to 问题:)

我已将查询 Bulder 分配给变量 $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] 输出将缩短为一维数组:

$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;

已将 "first()" 方法添加到原始 $query 中。我是对的,如果是,为什么会这样?

嗯,这是因为默认情况下 PHP 中的一个对象(在您的例子中是查询生成器对象)是通过引用传递的。您可以在此处阅读更多相关信息:PHP OOP References.

我引用上面的参考:

A PHP reference is an alias, which allows two different variables to write to the same value.

当您将查询构建器对象传递给 $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);

希望对您有所帮助!