2017-08-11 78 views
1

我想爲多個表使用單個模型文件。Laravel - 多個表的單一模型

爲什麼?

所有表的表結構是相同的

我有幾列存儲爲JSON數組,我想使用Laravel的內置JSON序列化,而不是手動序列化陣列。

我已經閱讀過laracast博客,這在Laravel中是不可能的,但是有沒有其他辦法可以使它成爲可能。

在此先感謝!

+0

據我所知,這是不可能的,因爲表或模型都是獨立的實體。可能現在你的表格結構相同,但在不久的將來,它可能會改變。如果您仍然找到解決方案,我建議您不要這樣做。 –

+0

但模型是非常基本的,不可能改變,所以它是有道理的,而不是創建多個模型文件@SaadSuri是否有任何選項,我可以避免創建多個模型文件... –

+1

在模型你可以定義表('protected $ table ='my_flights';'),所以也許如果你在構造函數中根據傳遞給模型的屬性設置這個變量,也許它會工作,但你必須嘗試,我從來沒有做過。 –

回答

0

您可以創建一個基本模型,該模型具有所有模型共有的邏輯,然後創建從基礎模型繼承的單個模型。

class Auto extends Model 
{ 
    protected $casts = [ 
     'details' => 'json', 
    ]; 

    public function getWheelsAttribute() 
    { 
     return $this->details->wheels; 
    } 
} 

class Car extends Auto 
{ 
    // models your "cars" table 
} 

class Truck extends Auto 
{ 
    // models your "trucks" table 
} 

class Bus extends Auto 
{ 
    // models your "buses" table 
} 

或者,您可以創建一個具有常用功能的特徵,並在您的所有子模型中使用特徵。

trait HasJsonDetails 
{ 
    protected $casts = [ 
     'details' => 'json', 
    ]; 

    public function getWheelsAttribute() 
    { 
     return $this->details->wheels; 
    } 
} 

class Car extends Auto 
{ 
    // models your "cars" table 

    use HasJsonDetails; 
} 

class Truck extends Auto 
{ 
    // models your "trucks" table 

    use HasJsonDetails; 
} 

class Bus extends Auto 
{ 
    // models your "buses" table 

    use HasJsonDetails; 
} 

或者,另一種選擇,如果表結構確實是而且將永遠是相同的,將所有的表合併成一個表,並使用單表繼承擁有多個車型都使用相同的表。

使用此方法,您需要在表格中添加一個type字段,以告訴您使用哪個類來爲單個行建模。這還需要一些定製,但你可以找到一個STI包使用,或按照這個論壇主題的更多信息:

https://laravel.io/forum/02-17-2014-eloquent-single-table-inheritance

這當然,仍然需要用的方法之一進行組合如上所述在多個模型中共享執行邏輯。