我已将 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 查询生成器分配给一个变量。使用时会发生变化的主要内容,如果未能解决你的问题,请参考以下文章