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()”方法。我是对的,如果是的话,为什么会发生?
好吧,这是因为默认情况下,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)
希望有帮助!
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |