从 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)