Мое решение для этого - переопределить метод newFromBuilder
в модели (Laravel 5.6). Вот так:
App \ Схемы \ BaseScheme
abstract class BaseScheme extends Electronic
{
// abstract methods to implement
// ...
}
App \ Схемы \ ElectronicTypeA
class ElectronicTypeA extends BaseScheme
{
// Electronic Type A logic
}
App \ Схемы \ ElectronicTypeB
class ElectronicTypeB extends BaseScheme
{
// Electronic Type B logic
}
App \ Models \ Electronic
use Illuminate\Database\Eloquent\Model;
class Electornic extends Model
{
public function newFromBuilder($attributes = [], $connection = null)
{
if (!class_exists($attributes->model_type)) {
throw new \Exception("Invalid Scheme ({$attributes->model_type})");
}
$class = $attributes->model_type;
$model = new $class;
if (!$model instanceof \App\Schemes\BaseScheme) {
throw new \Exception("Scheme class is invalid ({$attributes->model_type})");
}
$model->exists = true;
$model->setRawAttributes((array) $attributes, true);
$model->setConnection($connection ?: $this->getConnectionName());
$model->fireModelEvent('retrieved', false);
return $model;
}
Где \App\Schemes\BaseScheme
- это абстракция, которая распространяется на все логические модели. \App\Schemes\BaseScheme
также расширяет оригинальную модель Eloquent.
* * * * * * * * * * * '' * '' 'хорошо' в том, что он работает и с возвращенной коллекцией. Таким образом, вы можете взаимодействовать с моделью, как если бы это была обычная модель, но вы действительно взаимодействуете с конкретными классами (typeA, typeB).