1. Go to this page and download the library: Download visavi/motor-orm 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/ */
visavi / motor-orm example snippets
# Create class
use MotorORM\Builder;
class TestModel extends Builder
{
public string $table = __DIR__ . '/test.csv';
}
# Find by primary key
TestModel::query()->find(1);
# Find by name limit 1
TestModel::query()->where('name', 'Миша')->limit(1)->get();
# Find by name and first 1
TestModel::query()->where('name', 'Миша')->first();
# Find by name and title
TestModel::query()->where('name', 'Миша')->where('title', 'Заголовок10')->get();
# Get from condition
TestModel::query()->where('time', '>=', 1231231235)->get();
# Get by condition in
TestModel::query()->whereIn('id', [1, 3, 4, 7])->get();
# Get by condition not in
TestModel::query()->whereNotIn('id', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])->get();
# Get records by multiple conditions and pagination
TestModel::query()
->where(function(Builder $builder) {
$builder->where('name', 'Миша');
$builder->orWhere(function(Builder $builder) {
$builder->where('name', 'Петя');
$builder->where('title', '<>', '');
});
})
->paginate(10);
# Get count
TestModel::query()->where('time', '>', 1231231234)->count();
# Get lines 1 - 10
$lines = TestModel::query()->offset(0)->limit(10)->get();
# Get last 10 records
$lines = TestModel::query()->orderByDesc('created_at')->offset(0)->limit(10)->get();
# Get headers
TestModel::query()->headers();
# Get first line
TestModel::query()->first();
# Get first 3 lines
TestModel::query()->limit(3)->get();
# Get last 3 lines
TestModel::query()->orderByDesc('created_at')->limit(3)->get();
# Find by name and double sort (time desc, id asc)
Test::query()
->where('name', 'Миша')
->orderByDesc('time')
->orderBy('id')
->limit(3)
->get();
# Create string
TestModel::query()->create(['name' => 'Миша']);
# Update strings
TestModel::query()->where('name', 'Миша')->update(['text' => 'Новый текст']);
# Update string
$test = TestModel::query()->where('name', 'Миша')->first();
$test->text = 'Новый текст';
$test->save();
# Update strings
$testModel = TestModel::query()->find(17);
$affectedLines = $testModel->update(['text' => 'Новый текст']);
# Delete records
TestModel::query()->where('name', 'Миша')->delete();
# Delete records
$records = TestModel::query()->get();
foreach($records as $record) {
$record->delete();
}
# Truncate file
TestModel::query()->truncate();
// Строки начинающиеся на hi
$test = TestModel::query()->where('tag', 'like', 'hi%')->get();
// Строки заканчивающиеся на hi
$test = TestModel::query()->where('tag', 'like', '%hi')->get();
// Строки содержащие hi
$test = TestModel::query()->where('tag', 'like', '%hi%')->get();
// Этот запрос эквивалентен запросу выше
$test = TestModel::query()->where('tag', 'like', 'hi')->get();
// Будут найдено первое совпадение NAME, name, namE, Name итд
$user = User::query()->where('login', 'lax', 'name')->first();
class Story extends Model
{
protected array $casts = [
'rating' => 'int',
'reads' => 'int',
'locked' => 'bool',
];
}
class Story extends Model
{
public function scopeActive(Builder $query): Builder
{
return $query->where('active', true);
}
}
Story::query()
->active()
->paginate($perPage);
class Story extends Model
{
public function scopeOfType(Builder $query, string $type): Builder
{
return $query->where('type', $type);
}
}
$sortByVotes = 'sort_by_votes';
$users = Story::query()
->when($sortByVotes, function ($query, $sortByVotes) {
$query->orderBy('votes');
}, function ($query) {
$query->orderBy('name');
})
->get();
// Прямая связь
class User extends Model
{
public function story(): Builder
{
return $this->hasOne(Story::class);
}
}
// Обратная связь
class Story extends Model
{
public function user(): Builder
{
return $this->hasOne(User::class, 'id', 'user_id');
}
}
class Story extends Model
{
public function comments(): Builder
{
return $this->hasMany(Comment::class);
}
}
class Story extends Model
{
public function tags(): Builder
{
return $this->hasManyThrough(Tag::class, TagStory::class);
}
}
class StoryRepository implements RepositoryInterface
public function getStories(int $perPage): CollectionPaginate
{
return Story::query()
->orderByDesc('locked')
->orderByDesc('created_at')
->with(['user', 'comments'])
->paginate($perPage);
}
}
foreach ($storyRepository->getStories(10) as $story) {
echo $story->user->login;
}
$migration->changeTable(function (Migration $table) {
// Создаст колонку text c текстом по умолчанию "Текст" после колонки title
$table->create('text')->default('Текст')->after('title');
// Создаст колонку test перед колонкой id
$table->create('test')->before('id');
});