我相信這裏最好的解決方案(對於數據庫大小至少)應該是簡單地將readable_type
更改爲ENUM('Lion\Company', 'Lion\People')
。
話雖這麼說,如果你真的想解決這個在Laravel方面,你必須創建擴展從Illuminate\Database\Eloquent\Relations\Morph*
¹新的類,並覆蓋它們的構造²才能得到只有最後值在破折號後,在$morphClass
。事情是這樣的:
<?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);
}
}
然後,延長自己的模型或示範基地,覆蓋morphOne
,morphMany
和morphToMany
方法來利用你的新的擴展類。事情是這樣的:
<?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
和這實際上是從MorphOneOrMany
繼承了MorphOne
和MorphMany
ToMany
- 。
有這樣做的一種方式,但它需要相當一些工作,它可能不是你的數據庫的最佳解決方案尺寸問題。您是否考慮將'readable_type'轉換爲'ENUM('Lion \ People','Lion \ Company')'字段? – rmobis
@Raphael_我不得不承認,我期待的是雄辯的解決方案,但這個看起來像一個可能性......:D –
這實際上比只有'人'或'公司'佔用的空間更小。如果你真的想要雄辯的解決方案,讓我知道,我會發布它。 – rmobis