трех разнородных сущностей, требующих единого идентификатора для авторизации?Если вам действительно нужен единый сквозной идентификатор, то проще всего использовать одну таблицу регистраций + N таблиц профилей (по одной для каждого типа).
Как устранять потенциальные дубли и делать выборку по трем таблицам.Это сильно зависит от логики и требований приложения.
я про то что данные передаются через конструктор . Ведь можно просто в самом коде их определить того же файлаВ конструктор в данном случае передаются на данные, а объект, который будет строить запросы. Это же класс репозитория - он инкапсулирует запросы к БД, но пользуется при этом моделями Eloquent.
class PortfoliosRepository extends Repository {
public function __construct(Portfolio $portfolio) {
$this->model = $portfolio;
}
// Этот метод, скорее всего, есть в базовом классе
public function find(int $id): ?Portfolio
{
return $this->model->find($id);
}
// А это пример инкапсуляции сложной логики
public function featured(): Collection
{
return $this->model
->with(['some', 'relations'])
->where('field', 'value')
->orWhere('other_field', 'value')
->orderBy('created_at')
->limit(42)
->get()
->each
->append('mutated_attribute');
}
}
$repository = new PortfoliosRepository(
new Portfolio // <- не какое-то существующее портфолио из БД, а "пустой" объект
);
$repository->featured();
class UniqueAmongActiveClients implements \Illuminate\Contracts\Validation\Rule
{
public function passes($attribute, $value): bool
{
return Client::shouldBeUniqueAndItIs($attribute, $value, auth()->id());
}
}
class Client extends Eloquent
{
public static function shouldBeUniqueAndItIs(string $attribute, $value, ?int $excludedId = null): bool
{
$query = static::withoutTrashed()->where($attribute, $value);
if ($excludedId) {
$query->where('id', '<>', $excludedId);
}
return $query->doesntExist();
}
}
deleted_at
заменять костылями, как советуют в соседних ответах, конечно, не нужно. app('events')->listen('eloquent.saved: *', ...);
app('events')->listen('eloquent.deleted: *', ...);
app('events')->listen(['eloquent.pivotAttached: *', 'eloquent.pivotDetached: *', 'eloquent.pivotUpdated: *'], ...);
Cache::remember('key', 60, function () {
return file_get_contents('http://json/');
});
route(
'route.name',
array_merge(
request()->query(),
[
'sortBy' => 'relevance_score',
'sortOrder' => ($currentSortBy === 'relevance_score' && $currentSortOrder === 'asc') ? 'desc' : 'asc',
]
)
)
Thehttps://laravel.com/docs/5.7/eloquent-relationship...limit
andtake
query builder methods may not be used when constraining eager loads.