我的解决方案是在模型上覆盖newFromBuilder
方法(Laravel 5.6)。如下:
App\Schemes\BaseScheme
abstract class BaseScheme extends Electronic
{
}
App\Schemes\ElectronicTypeA
class ElectronicTypeA extends BaseScheme
{
}
App\Schemes\ElectronicTypeB
class ElectronicTypeB extends BaseScheme
{
// Electronic Type B logic
}
应用程序\Models\电子
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)进行交互。