So the answer is complicated.
Like @Moshe Katz offered I created DummyClass and changed createModelByType().
class Balance extends CommonModel
{
public $subject;
public $subject_id;
public function subjectable(): MorphTo
{
return $this->morphTo(__FUNCTION__, 'subject', 'subject_id');
}
}
<?php
namespace App\Models;
use App\Models\Replace\MorphTo;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class CommonModel extends Model
{
public function isDummy()
{
return false;
}
protected function newMorphTo(Builder $query, Model $parent, $foreignKey, $ownerKey, $type, $relation)
{
return new MorphTo($query, $parent, $foreignKey, $ownerKey, $type, $relation);
}
}
<?php
namespace App\Models\Replace;
use App\Models\DummyClass;
use Illuminate\Database\Eloquent\Relations\MorphTo as IlluminateMorphTo;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Arr;
class MorphTo extends IlluminateMorphTo
{
public function createModelByType($type)
{
$class = Arr::get(Relation::morphMap() ?: [], $type, DummyClass::class);
return tap(new $class, function ($instance) {
if (! $instance->getConnectionName()) {
$instance->setConnection($this->getConnection()->getName());
}
});
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class DummyClass extends Model
{
protected $connection = 'sqlite_fake';
public function isDummy()
{
return true;
}
}
'connections' => [
'sqlite_fake' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
...
Schema::connection('sqlite_fake')->create('dummy_classes', function ($table) {
$table->id();
});