欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

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

創(chuàng)新互聯(lián)建站主營德州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),德州h5小程序定制開發(fā)搭建,德州網(wǎng)站營銷推廣歡迎德州等地區(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 中,但是有一個非常嚴重的問題: 我們在新增或者刪除模型的時候,會很容易忘記去更新這個定義 。我已經(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)它:

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

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

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)

小程序開發(fā)