gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:23:10 25 4
gpt4 key购买 nike

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

我已将 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()”方法。我说得对吗?如果是,为什么会发生这种情况?

最佳答案

这是因为默认情况下 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);

希望这有帮助!

关于laravel - 我已将 Laravel 查询生成器分配给一个变量。使用时会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com