最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Laravel設(shè)置多態(tài)關(guān)系模型別名的方式

 更新時(shí)間:2019年10月17日 11:30:40   作者:小張  
這篇文章主要介紹了Laravel 中簡單設(shè)置多態(tài)關(guān)系模型別名的方式,需要的朋友可以參考下

作為 Laravel 的重度使用者肯定都對多態(tài)關(guān)系不默生,以官方文檔為例,文章有標(biāo)簽,視頻有標(biāo)簽,那么文章和視頻這些模型與標(biāo)簽?zāi)P偷年P(guān)系就是 多態(tài)多對多(Many To Many (Polymorphic))

如果我們給 ID 為 1 的文章打上兩個(gè)標(biāo)簽,數(shù)據(jù)庫標(biāo)簽關(guān)系表的的存儲結(jié)果就是這樣子:

> 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',
]);

https://laravel.com/docs/6.x/eloquent-relationships#custom-polymorphic-types

我們可以將這個(gè)定義寫到 AppServiceProvider 中,但是有一個(gè)非常嚴(yán)重的問題: 我們在新增或者刪除模型的時(shí)候,會很容易忘記去更新這個(gè)定義 。我已經(jīng)至少出現(xiàn)這個(gè)問題 3 次了,所以我一直在糾結(jié)有沒有更好的方法,今天突然靈機(jī)一動(dòng),實(shí)現(xiàn)了一個(gè)看起來似乎是一個(gè)不錯(cuò)的方式,分享給大家。

思路來源

我嘗試跟蹤了一遍源碼,發(fā)現(xiàn)模型中有一個(gè)方法 getMorphClass ,多態(tài)關(guān)聯(lián)的時(shí)候,就是用它來取目標(biāo)對象的類型名稱的,默認(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;
}

那么,只要我們在模型中覆蓋這個(gè)方法便可以方便的實(shí)現(xiàn)目標(biāo)了。

實(shí)現(xiàn)目標(biāo)

我們有兩個(gè)選擇去實(shí)現(xiàn)它:

  1. 創(chuàng)建一個(gè)模型基類覆蓋這個(gè)方法,所有的模型都來集成它即可;
  2. 創(chuàng)建一個(gè) trait,在需要的模型中引入它。

我當(dāng)然會選擇 trait 方式來實(shí)現(xiàn),不管從定義還是代碼耦合度上,使用 trait 來解決這類特性需求都是再適合不過了,如果你對 trait 還不太熟悉,可以閱讀我之前的文章: 《我所理解的 PHP Trait》

我們的目標(biāo)是使用表名來做為關(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;

 //...
}

友情提示

當(dāng)然,如果你習(xí)慣給表名加前綴,或者你的表名與模型名不太一致,那么,你只需要修改 trait 中 getMorphClass 的實(shí)現(xiàn)即可,我個(gè)人的習(xí)慣是模型名就是表名的單數(shù),不帶前綴。

總結(jié)

以上所述是小編給大家介紹的Laravel設(shè)置多態(tài)關(guān)系模型別名的方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

最新評論

宿松县| 稻城县| 舒兰市| 安乡县| 健康| 新乡县| 五家渠市| 麻阳| 兴化市| 柳江县| 定州市| 买车| 敖汉旗| 白山市| 遵义市| 六安市| 仁寿县| 云阳县| 馆陶县| 通渭县| 高州市| 东兰县| 余干县| 神池县| 东安县| 五河县| 通许县| 衡水市| 都江堰市| 寿宁县| 合水县| 仙游县| 高雄市| 莲花县| 山丹县| 栾川县| 榆林市| 云安县| 藁城市| 尚志市| 韶关市|