怎么在Laravel中設(shè)置多態(tài)關(guān)系模型別名?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站主營(yíng)德州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件定制開(kāi)發(fā),德州h5小程序定制開(kāi)發(fā)搭建,德州網(wǎng)站營(yíng)銷(xiāo)推廣歡迎德州等地區(qū)企業(yè)咨詢> 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 中,但是有一個(gè)非常嚴(yán)重的問(wèn)題: 我們?cè)谛略龌蛘邉h除模型的時(shí)候,會(huì)很容易忘記去更新這個(gè)定義 。我已經(jīng)至少出現(xiàn)這個(gè)問(wèn)題 3 次了,所以我一直在糾結(jié)有沒(méi)有更好的方法,今天突然靈機(jī)一動(dòng),實(shí)現(xiàn)了一個(gè)看起來(lái)似乎是一個(gè)不錯(cuò)的方式,分享給大家。
思路來(lái)源
我嘗試跟蹤了一遍源碼,發(fā)現(xiàn)模型中有一個(gè)方法 getMorphClass ,多態(tài)關(guān)聯(lián)的時(shí)候,就是用它來(lái)取目標(biāo)對(duì)象的類型名稱的,默認(rèn)返回類名:
public function getMorphClass() { $morphMap = Relation::morphMap(); if (! empty($morphMap) && in_array(static::class, $morphMap)) { return array_search(static::class, $morphMap, true); } return static::class; }
那么,只要我們?cè)谀P椭懈采w這個(gè)方法便可以方便的實(shí)現(xiàn)目標(biāo)了。
實(shí)現(xiàn)目標(biāo)
我們有兩個(gè)選擇去實(shí)現(xiàn)它:
創(chuàng)建一個(gè)模型基類覆蓋這個(gè)方法,所有的模型都來(lái)集成它即可;
創(chuàng)建一個(gè) trait,在需要的模型中引入它。
我當(dāng)然會(huì)選擇 trait 方式來(lái)實(shí)現(xiàn),不管從定義還是代碼耦合度上,使用 trait 來(lái)解決這類特性需求都是再適合不過(guò)了,如果你對(duì) trait 還不太熟悉,可以閱讀我之前的文章: 《我所理解的 PHP Trait》
我們的目標(biāo)是使用表名來(lái)做為關(guān)系類別名,那么在模型中如何獲取表名呢,直接使用模型的 getTable 即可,那么整個(gè) trait 的實(shí)現(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 是一套簡(jiǎn)潔、優(yōu)雅的PHP Web開(kāi)發(fā)框架。它可以讓你從面條一樣雜亂的代碼中解脫出來(lái);它可以幫你構(gòu)建一個(gè)完美的網(wǎng)絡(luò)APP,而且每行代碼都可以簡(jiǎn)潔、富于表達(dá)力。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。
新聞標(biāo)題:怎么在Laravel中設(shè)置多態(tài)關(guān)系模型別名-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://muchs.cn/article46/cddieg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、域名注冊(cè)、小程序開(kāi)發(fā)、定制開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容