This sample code uses Google Drive API v3.
Gfk = Google File Key ( can be the id of either a file or a folder ).
Methods:
- moveTo | Moves a file/folder from its first parent folder to a given destination folder. The file/folder gets removed from its original first parent folder;
- addParents and removeParents | Only adds or removes one or move parents. addParents does NOT remove any original parent, only adds.
class Gfiles {
private $service;
public function setService(\Google_Client $client) : self {
$this->service = (new \Google_Service_Drive($client))->files;
return $this;
}
public function moveTo(string $gfk, string $to_gfk) : \Google_Service_Drive_DriveFile {
$body = new \Google_Service_Drive_DriveFile();
// Gets the first parent. You should further implement this if you wish a different behaviour.
$from_gfk = $this->service->get($gfk, ['fields' => 'parents'])->parents[0];
$this->service->update($gfk, $body, ['addParents' => $to_gfk]);
$this->service->update($gfk, $body, ['removeParents' => $from_gfk]);
return $this->service->get($gfk, ['fields' => 'parents']);
}
/**
* $parents_gfk expects an array like ['gfk parent 1', 'gfk parent 2'].
*/
private function updateParents(string $method, string $gfk, array $parents_gfk) : \Google_Service_Drive_DriveFile {
$body = new \Google_Service_Drive_DriveFile();
$parents = join(',', $parents_gfk);
$this->service->update($gfk, $body, [$method => $parents]);
return $this->service->get($gfk, ['fields' => 'parents']);
}
public function addParents(string $gfk, array $parents_gfk) : \Google_Service_Drive_DriveFile {
return $this->updateParents('addParents', $gfk, $parents_gfk);
}
public function removeParents(string $gfk, array $parents_gfk) : \Google_Service_Drive_DriveFile {
return $this->updateParents('removeParents', $gfk, $parents_gfk);
}
}