我已将 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);
希望对您有所帮助!
这是一个 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);
希望对您有所帮助!