【问题标题】:Laravel eloquent and many polymorphic joinsLaravel 雄辩的和许多多态连接
【发布时间】:2020-11-16 04:08:24
【问题描述】:

我有一些 Laravel 多态模型,其中包括一个用户模型,它可以有许多预订日历条目,也可以有许多假期条目。 我可以编写以下 SQL 查询来拉回我需要的数据,但在查询的雄辩版本中遇到了困难。也许这是我的模型关系或我对 Laravel 中的工作方式的理解。我有一些雄辩的查询确实有效,但是它们的效率非常低,并且在我调查时使用许多选择,而不仅仅是一个。

我的 SQL:

select hol.* 
from booking_calendar bc
join holidays hol 
on bc.booked_by_id = hol.id
where bc.model_type='App\Staff'
and bc.model_id=123
and bc.booked_by_type='App\Holiday'

数据库表:

Staff: (App\Staff)
  id                    123
  ...

booking_calendar: (App\BookingCalendar)
  model_id              123
  model_type            App\Staff
  ...
  booked_by_id          77
  booked_by_type        App\Holiday

holidays: (App\Holiday)
  id                   77
  ...

我想我的问题的症结在于 booking_calendar 有 2 个多态关系,因为它也用于资产预订。

我想做的是 $staff->holidays() 或 $staff->bookingCalendar->holidays。

如果有人能在一个非原始 SQL + 水合物的雄辩的 select 语句中解释如何做到这一点,我将不胜感激。

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    我根据您的数据库设计假设了这些关系。

    员工 BookingCalendar --> 多态:一对多

    假日 BookingCalendar --> 多态:一对多

    员工模型

    public function bookingCalendars(){
       return $this->morphMany(App\BookingCalendar::class, 'model');
    }
    

    假日模特

    public function bookingCalendars(){
       return $this->morphMany(App\BookingCalendar::class, 'booked_by');
    }
    

    BookingCalendar 模型

    public function model(){
       return $this->morphTo();
    }
    
    public function booked_by(){
       return $this->morphTo();
    }
    

    filterpluck 是收集方法。

    $staff = Staff::with('bookingCalendars.model')->find($id);
    
    $filtered_bks = $staff->bookingCalendars->filter(function($bk){
       return $bk->model_type == 'App\Holiday';
    });
    
    $holidays = $filtered_bks->pluck('model');
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2018-06-03
      • 2018-02-10
      • 2022-01-15
      • 2023-04-03
      • 2019-06-09
      • 2018-05-17
      • 1970-01-01
      • 2020-03-11
      相关资源
      最近更新 更多