怎么在Laravel中設(shè)置多態(tài)關(guān)系模型別名-創(chuàng)新互聯(lián)

怎么在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)它:

  1. 創(chuàng)建一個(gè)模型基類覆蓋這個(gè)方法,所有的模型都來(lái)集成它即可;

  2. 創(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 是什么

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)

小程序開(kāi)發(fā)