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

Posted

技术标签:

【中文标题】我已将 Laravel 查询生成器分配给一个变量。使用时会发生变化【英文标题】:I've assigned Laravel Query Builder to a variable. It changes when being used 【发布时间】:2018-01-16 06:45:06 【问题描述】:

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

我已将 Query 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;

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

【问题讨论】:

像这样在选择中使用数组select(['tourist_id', 'tourist_version']) 在您的第一个代码块中 $versions[slug1] 看起来像是一个错字;应该抛出 Use of undefined constant slug1, assumed 'slug1' 错误,因为您缺少 ''$versions['slug1'] @timlewis,谢谢,改变了。 【参考方案1】:

嗯,这是因为默认情况下,php 中的一个对象(在您的情况下是查询构建器对象)是通过引用传递的。您可以在此处阅读更多相关信息: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);

希望对您有所帮助!

【讨论】:

谢谢你,里桑!似乎我必须阅读更多关于对象和标识符的内容......:)

以上是关于我已将 Laravel 查询生成器分配给一个变量。使用时会发生变化的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中的 SQL 查询前面添加美元符号

我无法在python中正确地将我想要的值分配给一个变量[重复]

Make:变量赋值

将获取的值分配给 laravel 控制器中的变量

laravel 查询生成器总是返回?而不是变量的值

未定义的变量:请求 - Laravel 5.1