怎么在Laravel中設(shè)置多態(tài)關(guān)系模型別名?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

> select * from taggables; +--------+-------------+---------------+ | tag_id | taggable_id | taggable_type | +--------+-------------+---------------+ | 1 | 1 | App\Post | | 2 | 1 | App\Post | +--------+-------------+---------------+
相信有不少人和我一樣希望 taggable_type 的值不要直接用模型類名,而是使用表名: posts 。官方文檔的建議是:
use Illuminate\Database\Eloquent\Relations\Relation; Relation::morphMap([ 'posts' => 'App\Post', 'videos' => 'App\Video', ]);
/tupian/20230522/eloquent-relationships AppServiceProvider 中,但是有一個非常嚴重的問題: 我們在新增或者刪除模型的時候,會很容易忘記去更新這個定義 。我已經(jīng)至少出現(xiàn)這個問題 3 次了,所以我一直在糾結(jié)有沒有更好的方法,今天突然靈機一動,實現(xiàn)了一個看起來似乎是一個不錯的方式,分享給大家。
思路來源
我嘗試跟蹤了一遍源碼,發(fā)現(xiàn)模型中有一個方法 getMorphClass ,多態(tài)關(guān)聯(lián)的時候,就是用它來取目標(biāo)對象的類型名稱的,默認返回類名:
public function getMorphClass()
{
$morphMap = Relation::morphMap();
if (! empty($morphMap) && in_array(static::class, $morphMap)) {
return array_search(static::class, $morphMap, true);
}
return static::class;
}那么,只要我們在模型中覆蓋這個方法便可以方便的實現(xiàn)目標(biāo)了。
實現(xiàn)目標(biāo)
我們有兩個選擇去實現(xiàn)它:
創(chuàng)建一個模型基類覆蓋這個方法,所有的模型都來集成它即可;
創(chuàng)建一個 trait,在需要的模型中引入它。
我當(dāng)然會選擇 trait 方式來實現(xiàn),不管從定義還是代碼耦合度上,使用 trait 來解決這類特性需求都是再適合不過了,如果你對 trait 還不太熟悉,可以閱讀我之前的文章: 《我所理解的 PHP Trait》
我們的目標(biāo)是使用表名來做為關(guān)系類別名,那么在模型中如何獲取表名呢,直接使用模型的 getTable 即可,那么整個 trait 的實現(xiàn)如下:
app/Traits/UseTableNameAsMorphClass.php
<?php
namespace App\Traits;
trait UseTableNameAsMorphClass
{
public function getMorphClass()
{
return $this->getTable();
}
}然后在我們需要用到關(guān)系類型的模型中引入它即可:
<?php
namespace App;
use App\Traits\UseTableNameAsMorphClass;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use UseTableNameAsMorphClass;
//...
}Laravel 是一套簡潔、優(yōu)雅的PHP Web開發(fā)框架。它可以讓你從面條一樣雜亂的代碼中解脫出來;它可以幫你構(gòu)建一個完美的網(wǎng)絡(luò)APP,而且每行代碼都可以簡潔、富于表達力。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。
新聞標(biāo)題:怎么在Laravel中設(shè)置多態(tài)關(guān)系模型別名-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://chinadenli.net/article46/cddieg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、域名注冊、小程序開發(fā)、定制開發(fā)、關(guān)鍵詞優(yōu)化、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容