这是一个为什么问题,而不是如何:)
我已将查询投标分配给变量$ 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]输出将缩短为一维数组:< / p>
$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;
已添加&#34; first()&#34;原始$查询的方法。我是对的,如果是的话,为什么会这样?
答案 0 :(得分:1)
嗯,这是因为默认情况下,PHP中的对象(在您的情况下是Query构建器对象)是通过引用传递的。您可以在此处详细了解: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);
希望这有帮助!