从 Laravel 5.5 中的自联接插入分块值
Inserting chunked values from a self join in Laravel 5.5
所以,我有一个包含自连接且已分块的查询。我尝试 运行 查询,但我得到:
Call to undefined method stdClass::pluck()
DB::table('locations as u1')
->join('locations as u2','u1.id', '<>', 'u2.id')
->whereNotExists(function($query)
{
$query->select(DB::raw(1))
->from('routes')
->whereRaw('routes.from_id = u1.id')
->whereRaw('routes.to_id = u2.id');
})->orderBy('u1.id')->chunk(5000, function ($routes) {
foreach ($routes as $route){
$db = new Route;
$db->from_id = $route->pluck('u1.id');
$db->to_id = $route->pluck('u2.id');
$db->distance = Flow::GIS('OSRM')->route($route->pluck('u1.name'),$route->pluck('u2.name'))->distance();
$db->save();
}
});
如何在 foreach 循环中 select u1.id,u2.id,u1.name,u2.name?结果是 1.500.000 行大,所以不分块就是 bad.I 我使用 Postgres 作为我的数据库。
使用 Select 方法影响所选行的别名(u1.id、u2.id、u1.name、u2.name),然后使用该方法获取数据的别名:
DB::table('locations as u1')
->join('locations as u2','u1.id', '<>', 'u2.id')
->whereNotExists(function($query) {
$query->select(DB::raw(1))
->from('routes')
->whereRaw('routes.from_id = u1.id')
->whereRaw('routes.to_id = u2.id');
})
->select( \DB::raw("u1.id as u1id, u2.id as u2.id, u1.name as u1name, u2.name as u2name") )
->orderBy('u1.id')
->chunk(5000, function ($routes) {
foreach ($routes as $route){
$db = new Route;
$db->from_id = $route->u1id;
$db->to_id = $route->u2id;
$db->distance = Flow::GIS('OSRM')->route($route->u1name, $route->u2name)->distance();
$db->save();
}
});
注意:pluck 方法仅适用于集合,在您的 foreach 中,您将每一行作为对象 (stdClass)
所以,我有一个包含自连接且已分块的查询。我尝试 运行 查询,但我得到:
Call to undefined method stdClass::pluck()
DB::table('locations as u1')
->join('locations as u2','u1.id', '<>', 'u2.id')
->whereNotExists(function($query)
{
$query->select(DB::raw(1))
->from('routes')
->whereRaw('routes.from_id = u1.id')
->whereRaw('routes.to_id = u2.id');
})->orderBy('u1.id')->chunk(5000, function ($routes) {
foreach ($routes as $route){
$db = new Route;
$db->from_id = $route->pluck('u1.id');
$db->to_id = $route->pluck('u2.id');
$db->distance = Flow::GIS('OSRM')->route($route->pluck('u1.name'),$route->pluck('u2.name'))->distance();
$db->save();
}
});
如何在 foreach 循环中 select u1.id,u2.id,u1.name,u2.name?结果是 1.500.000 行大,所以不分块就是 bad.I 我使用 Postgres 作为我的数据库。
使用 Select 方法影响所选行的别名(u1.id、u2.id、u1.name、u2.name),然后使用该方法获取数据的别名:
DB::table('locations as u1')
->join('locations as u2','u1.id', '<>', 'u2.id')
->whereNotExists(function($query) {
$query->select(DB::raw(1))
->from('routes')
->whereRaw('routes.from_id = u1.id')
->whereRaw('routes.to_id = u2.id');
})
->select( \DB::raw("u1.id as u1id, u2.id as u2.id, u1.name as u1name, u2.name as u2name") )
->orderBy('u1.id')
->chunk(5000, function ($routes) {
foreach ($routes as $route){
$db = new Route;
$db->from_id = $route->u1id;
$db->to_id = $route->u2id;
$db->distance = Flow::GIS('OSRM')->route($route->u1name, $route->u2name)->distance();
$db->save();
}
});
注意:pluck 方法仅适用于集合,在您的 foreach 中,您将每一行作为对象 (stdClass)