Uważam, że najlepszym rozwiązaniem w tym miejscu (przynajmniej dla rozmiaru bazy danych) byłoby po prostu zmienić readable_type
na ENUM('Lion\Company', 'Lion\People')
.
Biorąc to pod uwagę, jeśli naprawdę chcesz się tym zająć na stronie laravel, musisz utworzyć nowe klasy rozciągające się od Illuminate\Database\Eloquent\Relations\Morph*
¹ i nadpisanie konstruktorów ² jak uzyskać tylko ostatni wartość po kresce, na $morphClass
. Coś takiego:
<?php
use \Illuminate\Database\Eloquent\Model;
use \Illuminate\Database\Eloquent\Builder;
class MyMorphOne extends \Illuminate\Database\Eloquent\Relations\MorphOne {
public function __construct(Builder $query, Model $parent, $type, $id) {
parent::__construct($query, $parent, $type, $id);
$this->morphClass = substr($this->morphClass, strrpos($this->morphClass, '\\') + 1);
}
}
Następnie przedłużyć swój własny model lub bazowy model nadpisać morphOne
, morphMany
i morphToMany
metod, aby skorzystać z nowych rozszerzonych klas. Coś takiego:
<?php
class People extends Eloquent {
// ...
public function morphOne($related, $name, $type = null, $id = null) {
$instance = new $related;
list($type, $id) = $this->getMorphs($name, $type, $id);
$table = $instance->getTable();
return new MyMorphOne($instance->newQuery(), $this, $table.'.'.$type, $table.'.'.$id);
}
}
*
= One
, Many
i ToMany
- które są rzeczywiście odziedziczony
MorphOneOrMany
na MorphOne
i MorphMany
.
istnieje sposób na osiągnięcie tego, ale to wymaga sporo pracy i nie jest to chyba najlepsze rozwiązanie dla Twojej bazy danych problem z rozmiarem. Czy rozważałeś zamianę "readable_type" na pole 'ENUM (" Lion \ People "," Lion \ Company ")? – rmobis
@Raphael_ Muszę przyznać, że oczekiwałem na rozwiązania Eloquent, ale ta wygląda jak jedna możliwość ...: D –
To zajmuje nawet mniej miejsca niż tylko "People" lub "Company". Jeśli naprawdę chcesz Wymowne rozwiązanie, daj mi znać, opublikuję to. – rmobis