我正在使用laravel-mongodb
(https://github.com/jenssegers/laravel-mongodb)来操纵mongodb数据。
我想将数据传输到从mongodb查询的mysql中,有一个演示函数可以执行此操作:
TestController.php
public function queryAndInsertMysql()
{
$articles = DB::connection('mongodb')->collection('articles')->get()->toArray();
DB::connection('mysql')->table('articles')->insert($articles);
dd('ok');
}
运行此功能时出错:
SQLSTATE[42S22]: Column not found: 1054 Unknown column '_id' in 'field list' (SQL: insert into `articles` (`_id`, `content`, `title`) values (59ad186437dd1f1968004334, hello..., hello), (59ad186437dd1f1968004335, foo..., foo), (59ad186437dd1f1968004336, bar..., bar))
发生错误是因为mongodb集合中有_id
字段,
并且mysql表中没有_id
字段,
所以在将它们插入mysql之前我需要删除_id
字段。
我尝试使用array_shift()
执行此操作但不起作用:
public function removeId()
{
$articles = DB::connection('mongodb')->collection('articles')->get()->toArray();
foreach ($articles as $article) {
array_shift($article);
}
dd($articles);
}
_id
字段仍然存在:
我该怎么办?
答案 0 :(得分:2)
您需要使用投影来过滤_id
:
public function queryAndInsertMysql()
{
$articles = DB::connection('mongodb')
->collection('articles')
->project(['_id' => 0])
->get()
->toArray();
DB::connection('mysql')->table('articles')->insert($articles);
dd('ok');
}
请注意mongodb是shemaless,除非您使用document validation强制执行它,因此建议将您希望在project
参数中插入SQL的所有字段列入白名单:
public function queryAndInsertMysql()
{
$articles = DB::connection('mongodb')
->collection('articles')
->project(['_id' => 0, 'content' => 1, 'title' => 1])
->get()
->toArray();
DB::connection('mysql')->table('articles')->insert($articles);
dd('ok');
}
即使您不小心拥有包含任何其他字段的文档,也会保证将被忽略。
答案 1 :(得分:1)
这是一个嵌套数组,因此您需要使用扩展的foreach
循环
foreach ($arr as $key => $value) {
/** Shift here... **/
}
示例强>
<?php
$a = [
0 => [
'_id' => 'sdgsdg'
]
];
$y = '';
foreach ($a as $key => $val) {
$y = array_shift($a[$key]);
}
var_dump($y); /** ---> string(6) "sdgsdg" **/
?>
答案 2 :(得分:1)
Laravel Collections地图功能可以帮助您:
https://laravel.com/docs/5.4/collections#method-map
删除_id字段,然后将它们插入MySQL数据库