亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel (nova) 繼承映射

Laravel (nova) 繼承映射

PHP
慕哥9229398 2022-01-02 16:22:59
我目前正在構建一個 Laravel nova 應用程序。我希望能夠通過繼承映射實現類似于 Doctrine 可以做的事情。讓我們假設以下示例:use Illuminate\Database\Eloquent\Model;class Event extends Model {    protected $attributes = [        'name' => null,        'starts_at' => null,        'ends_at' => null,    ];}class EventTypeA extends Event {  // has extra fields specific to EventTypeA}class EventTypeB extends Event {  // has extra fields specific to EventTypeB}現在我希望能夠:獲取所有EventTypeA的獲取所有EventTypeB的獲取所有事件并只關心共享信息。當然,對于上面的列表,所有 Eloquent 的優點,例如過濾、投影等都應該適用。據我所知laravel可能能夠漢勒EventTypeA和EventTypeB正確但是Event不得不需要從兩個表是不是真的有可能獲取數據。我知道 eloquent 的變形功能,但是根據我的理解,這會導致Event核心數據和后代特定屬性的單獨 nova 視圖。這在用戶體驗方面是不可接受的。我考慮過使用一個接口Event,EventTypeA然后EventTypeB將其實現。但是,我認為這將需要大量的體力勞動才能讓 Eloquent 對事件做一些有意義的事情。這聽起來像是一個常見問題,但是我無法找到有關如何在 laravel 中以正確方式執行此操作的任何資源(尤其是 nova 可以解決此問題)。
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

Laravel 沒有提供解決方案來為不同的表創建帶有子類的基本模型。反過來也是完全可能的:


class Event extends Model

{

    protected $table = 'events';

}

class EventA extends Event

{

    protected static function boot()

    {

        parent::boot();


        static::addGlobalScope(function (Builder $query) {

            $query->where('events.type', '=', 'a');

        });

    }

}


class EventB extends Event

{

    protected static function boot()

    {

        parent::boot();


        static::addGlobalScope(function (Builder $query) {

            $query->where('events.type', '=', 'b');

        });

    }

}


我通過使用數據透視表的中間模型并將某些屬性代理到子模型來解決類似的問題。


那么你的關系將是BelongsTo和HasMany。


在 UX 方面,您可以通過有條件地檢查資源屬性來自定義 Nova 中的字段。盡管我建議僅在詳細信息和表單視圖上執行此操作,因為在返回具有不同列的行時索引表將關閉。


public function fields(Request $request)

{

    return array_filter([

        ID::make()->sortable(),


        value(function () {

            if ($this->type === 'a') {

                return Boolean::make('A specific field')->hideFromIndex();

            }

        }),


        value(function () {

            if ($this->type === 'b') {

                return Boolean::make('B specific field')->hideFromIndex();

            }

        }),

    ]);

}


查看完整回答
反對 回復 2022-01-02
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

我最近才發現kirschbaum-development/nova-inline-relationship 這個包允許你將關系內聯到一個 nova 資源中,因此允許一個像這樣的結構:


class Event extends Model

{

  public function eventable()

  {

    return $this->morphTo();

  }

}

class Workshop extends Model

{

  public function event()

  {

    return $this->morphOne(Event::class, 'eventable');

  }

}

class StageTalk extends Model

{

  public function event()

  {

    return $this->morphOne(Event::class, 'eventable');

  }

}

然后在 nova 資源中


class Workshop extends Resource

{

  public function fields(Request $request)

  {

  return [

    MorphOne::make('Event')->inline(),

  ];

  }

}


查看完整回答
反對 回復 2022-01-02
  • 2 回答
  • 0 關注
  • 209 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號