1. Go to this page and download the library: Download lapaliv/laravel-bulk-upsert library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
lapaliv / laravel-bulk-upsert example snippets
foreach($models as $model){
$model->save();
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Lapaliv\BulkUpsert\Bulkable;
class User extends Model {
use Bulkable;
}
use App\Models\User;
$bulk = User::query()->bulk();
use App\Models\User;
$bulk = User::bulk();
use App\Models\User;
use Lapaliv\BulkUpsert\Bulk;
$bulk = new Bulk(User::class);
use App\Models\User;
use Lapaliv\BulkUpsert\Bulk;
$bulk = new Bulk(new User());
$users = $bulk->uniqueBy('email')->createAndReturn($data);
// $users is Illuminate\Database\Eloquent\Collection<App\Models\User>
$chunkSize = 100;
$bulk->uniqueBy('email')
->chunk($chunkSize);
foreach($data as $item) {
// The method `createOrAccumulate` will create rows
// only when it accumulates the `$chunkSize` rows.
$bulk->createOrAccumulate($item);
}
// The createAccumulated method will create all accumulated rows,
// even if their quantity is less than `$chunkSize`.
$bulk->createAccumulated();
$users = $bulk->updateAndReturn($data);
// $users is Illuminate\Database\Eloquent\Collection<App\Models\User>
$chunkSize = 100;
$bulk->chunk($chunkSize);
foreach($data as $item) {
// The method `updateOrAccumulate` will update rows
// only when it accumulates the `$chunkSize` rows.
$bulk->updateOrAccumulate($item);
}
// The updateAccumulated method will update all accumulated rows,
// even if their quantity is less than `$chunkSize`.
$bulk->updateAccumulated();
$users = $bulk->uniqueBy(['email'])
->upsertAndReturn($data);
// $users is Illuminate\Database\Eloquent\Collection<App\Models\User>
$chunkSize = 100;
$bulk->uniqueBy(['email'])
->chunk($chunkSize);
foreach($data as $item) {
// The method `upsertOrAccumulate` will upsert rows
// only when it accumulates the `$chunkSize` rows.
$bulk->upsertOrAccumulate($item);
}
// The upsertAccumulated method will upsert all accumulated rows,
// even if their quantity is less than `$chunkSize`.
$bulk->upsertAccumulated();
$chunkSize = 100;
$bulk->uniqueBy(['email'])
->chunk($chunkSize);
foreach($data as $item) {
$bulk->deleteOrAccumulate($item);
// or $bulk->forceDeleteOrAccumulate($item);
}
$bulk->deleteAccumulated();
// or $bulk->forceDeleteAccumulated();
use App\Models\User;
use Lapaliv\BulkUpsert\Collections\BulkRows;
$bulk
// The callback runs before creating.
// If your callback returns `false` then the model won't be created
// and deleted (if `deleted_at` was filled in)
->onCreating(fn(User $user) => /* ... */)
// The callback runs after creating.
->onCreated(fn(User $user) => /* ... */)
// The callback runs before updating.
// If your callback returns `false` then the model won't be updated,
// deleted (if `deleted_at` was filled in) and restored.
->onUpdating(fn(User $user) => /* ... */)
// The callback runs after updating.
->onUpdated(fn(User $user) => /* ... */)
// The callback runs before deleting.
// If your callback returns `false` then the model won't be deleted,
// but it doesn't affect the upserting.
->onDeleting(fn(User $user) => /* ... */)
// The callback runs before force deleting.
// If your callback returns `false` then the model won't be deleted,
->onForceDeleting(fn(User $user) => /* ... */)
// The callback runs after deleting.
->onDeleted(fn(User $user) => /* ... */)
// The callback runs after force deleting.
->onForceDeleted(fn(User $user) => /* ... */)
// The callback runs before upserting.
->onSaving(fn(User $user) => /* ... */)
// The callback runs after upserting.
->onSaved(fn(User $user) => /* ... */)
// Runs before creating.
// If the callback returns `false` then these models won't be created.
->onCreatingMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs after creating.
->onCreatedMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs before updating.
// If the callback returns `false` then these models won't be updated.
->onUpdatingMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs after updating.
->onUpdatedMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs before deleting.
// If the callback returns `false` then these models won't be deleted,
// but it doesn't affect the upserting.
->onDeletingMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs before force deleting.
// If the callback returns `false` then these models won't be deleted.
->onForceDeletingMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs after deleting.
->onDeletedMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs after force deleting.
->onForceDeletedMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs before restoring.
// If the callback returns `false` then these models won't be restored,
// but it doesn't affect the upserting.
->onRestoringMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs after restoring.
->onRestoredMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs before upserting.
// If the callback returns `false` then these models won't be upserting,
->onSavingMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
// Runs after upserting.
->onSavedMany(fn(Collection $users, BulkRows $bulkRows) => /* .. */)
use App\Models\User;
use Lapaliv\BulkUpsert\Collections\BulkRows;
User::saving(fn(User $user) => /* .. */);
User::savingMany(
fn(Collection $users, BulkRows $bulkRows) => /* .. */
);
namespace App\Observers;
use App\Models\User;
use Lapaliv\BulkUpsert\Collections\BulkRows;
class UserObserver {
public function creating(User $user) {
// ..
}
public function creatingMany(Collection $users, BulkRows $bulkRows) {
// ..
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model {
// ...
protected $fillable = ['user_id', 'text', 'uuid'];
// ...
}
class User extends Model {
// ...
protected $fillable = ['email', 'name'];
// ...
}
namespace App\Observers;
use Illuminate\Database\Eloquent\Collection;
use Lapaliv\BulkUpsert\Collections\BulkRows;
use Lapaliv\BulkUpsert\Entities\BulkRow;
class UserObserver {
public function savedMany(Collection $users, BulkRows $bulkRows): void {
$rawComments = [];
$bulkRows->each(
function(BulkRow $bulkRow) use(&$rawComments): void {
$bulkRow->original['user_id'] = $bulkRow->model->id;
$rawComments[] = $bulkRow->original;
}
)
Comment::query()
->bulk()
->uniqueBy(['uuid'])
->upsert($rawComments);
}
}
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Collection;
class Bulk {
public function __construct(Model|string $model);
/**
* Sets the chunk size.
*/
public function chunk(int $size = 100): static;
/**
* Defines the unique attributes of the rows.
* @param callable|string|string[]|string[][] $attributes
*/
public function uniqueBy(string|array|callable $attributes): static;
/**
* Defines the alternatives of the unique attributes.
* @param callable|string|string[]|string[][] $attributes
*/
public function orUniqueBy(string|array|callable $attributes): static;
/**
* Sets enabled events.
* @param string[] $events
*/
public function setEvents(array $events): static;
/**
* Disables the next events: `saved`, `created`, `updated`, `deleted`, `restored`.
*/
public function disableModelEndEvents(): static;
/**
* Disables the specified events or the all if `$events` equals `null`.
* @param string[]|null $events
*/
public function disableEvents(array $events = null): static;
/**
* Disables the specified event.
*/
public function disableEvent(string $event): static;
/**
* Enables the specified events or the all if `$events` is empty.
* @param string[]|null $events
*/
public function enableEvents(array $events = null): static;
/**
* Enables the specified event.
*/
public function enableEvent(string $event): static;
/**
* Sets the list of attribute names which should update.
* @param string[] $attributes
*/
public function updateOnly(array $attributes): static;
/**
* Sets the list of attribute names which shouldn't update.
* @param string[] $attributes
*/
public function updateAllExcept(array $attributes): static;
/**
* Enables soft deleted rows into select.
*
* @return $this
*/
public function withTrashed(): static;
/**
* Creates the rows.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
*/
public function create(iterable $rows, bool $ignoreConflicts = false): static;
/**
* Creates the rows if their quantity is greater than or equal to the chunk size.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
*/
public function createOrAccumulate(iterable $rows, bool $ignoreConflicts = false): static;
/**
* Creates the rows and returns them.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @param string[] $columns columns that should be selected from the database
* @return Collection<Model>
* @throws BulkException
*/
public function createAndReturn(iterable $rows, array $columns = ['*'], bool $ignoreConflicts = false): Collection;
/**
* Creates the all accumulated rows.
* @throws BulkException
*/
public function createAccumulated(): static;
/**
* Updates the rows.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
*/
public function update(iterable $rows): static;
/**
* Updates the rows if their quantity is greater than or equal to the chunk size.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
*/
public function updateOrAccumulate(iterable $rows): static;
/**
* Updates the rows and returns them.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @param string[] $columns columns that should be selected from the database
* @return Collection<Model>
* @throws BulkException
*/
public function updateAndReturn(iterable $rows, array $columns = ['*']): Collection;
/**
* Updates the all accumulated rows.
* @throws BulkException
*/
public function updateAccumulated(): static;
/**
* Upserts the rows.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
*/
public function upsert(iterable $rows): static;
/**
* Upserts the rows if their quantity is greater than or equal to the chunk size.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
*/
public function upsertOrAccumulate(iterable $rows): static;
/**
* Upserts the rows and returns them.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @param string[] $columns columns that should be selected from the database
* @return Collection<Model>
* @throws BulkException
*/
public function upsertAndReturn(iterable $rows, array $columns = ['*']): Collection;
/**
* Upserts the all accumulated rows.
* @throws BulkException
*/
public function upsertAccumulated(): static;
/**
* Deletes the rows.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
* @since 2.1.0
*/
public function delete(iterable $rows): static;
/**
* Deletes the rows if their quantity is greater than or equal to the chunk size.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
* @since 2.1.0
*/
public function deleteOrAccumulate(iterable $rows): static;
/**
* Force deletes the rows.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
* @since 2.1.0
*/
public function forceDelete(iterable $rows): static;
/**
* Force deletes the rows if their quantity is greater than or equal to the chunk size.
* @param iterable<int|string, Model|stdClass|array<string, mixed>|object> $rows
* @throws BulkException
* @since 2.1.0
*/
public function forceDeleteOrAccumulate(iterable $rows): static;
/**
* Deletes the all accumulated rows.
*
* @throws BulkException
* @since 2.1.0
*/
public function deleteAccumulated(): static;
/**
* Deletes the all accumulated rows.
*
* @throws BulkException
* @since 2.1.0
*/
public function forceDeleteAccumulated(): static;
/**
* Saves the all accumulated rows.
* @throws BulkException
*/
public function saveAccumulated(): static;
}
namespace Lapaliv\BulkUpsert\Entities;
class BulkRow {
/**
* The upserting/upserted model.
* @var Model
*/
public Model $model;
/**
* The original item from `iterable rows`.
* @var array|object|stdClass|Model
*/
public mixed $original;
/**
* Unique fields which were used for upserting.
* @var string[]
*/
public array $unique;
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.