Красноречивые нетерпеливые ограничения нагрузки по значениям родительских столбцов

Я на Laravel 5.2, и у меня есть проблема с использованием Eloquent для получения данных с нетерпеливо загруженными отношениями, которые должны быть ограничены значениями из других отношений. Я не уверен в правильном термине для этой модели отношений, и поэтому было трудно найти решение этого.

Архитектура

Код и таблицы/модели упрощены для ясности:

Три таблицы / модели:

E, D и M.

Отношения:

class D extends Model
{
  public function E()
  {
    return $this->belongsTo('AppE');
  }
}

class E extends Model
{
  public function D()
  {
    return $this->hasMany('AppD');
  }
  public function M()
  {
    return $this->hasMany('AppM');
  }
}

class M extends Model
{
  public function E()
  {
    return $this->belongsTo('AppE');
  }
}

Пример схемы D <*--1> E <1--*> M

Нет прямой связи между D и M.

Проблема

Я хочу список D, С E, а затем M охотно загружается в свойства объектов D таким образом, что $D->E->>M является списком M, принадлежащим тому E, который в свою очередь D принадлежит.

Проблема в том, что мне нужно, чтобы нетерпеливая загрузка для M была ограничена значениями из Столбцов на D.

Образец:

$D = AppD::with(['E' => function($query) {

  $query->with(['M' => function($query) {

    //example of what I'd like to do (but doesn't work)
    $query->where('start_timestamp','>=','D.start_timestamp'); 

  }]);

}])->get();

В этом примере он пытается сравнить start_timestampполе M со строкой ‘D. start_timestamp’ вместо start_timestampзначения D.

Вопрос

Можно ли ограничить нагрузку по более ранним значениям связанных столбцов? Если да, то как?

Я пытался…

…использование $query — >whereRaw для явной ссылки на столбцы более ранней таблицы

$query->whereRaw('M.start_timestamp >= D.start_timestamp')

но это ошибки с «D. start_timestamp» как неизвестный столбец.

…использование whereColumn, но это, похоже, не работает с ограничениями загрузки (ошибки с неизвестным столбцом «column»).


Я пытаюсь решить эту проблему «красноречивым способом», избегая использования raw SQL и соединений. Я знаю, как решить эту проблему с помощью SQL и соединений, но я бы предпочел избежать этого, если это возможно.

Любая помощь, которую вы можете предложить, будет оценена, спасибо.

1 ответ

  1. ваше приведенное выше утверждение вопроса сбивает с толку, но согласно моему пониманию вы хотите загрузить Mзапись из D, значит D -> E -> Mи нет прямой связи между Dи M. Вы можете сделать это

    например:

    D имеет отношение к E

    и

    E имеет отношение к M

    и вы хотите загрузить все связанные записи, вы можете сделать это

    D::with(
         //this will fetch E records which belongs to D
         ['E'=>function($q){
             //your desire query, which you want to apply on E model/records
             $q->where('status','1')->where('problemname', '<>',null);
    
            },
    
         //this will fetch M records which belongs to E
         'E.M'=>function($q){
             //your desire query, which you want to apply on M model/records
             $q->where('status','1')->where('details', '<>',null);
            },
         ])->get();
    

    ваши результаты будут выглядеть следующим образом

    Родительская воля содержит записи D

    Array(
       'name'=>'test',
       'email'=>'test@test.com',
       'dob'=>'1990-01-01',
    
       'E'=>Array(
             'problemname'=>'test',
             'problemtitle'=>'hello',
             'status'=>'1',
             ...
    
             'M'=>Array(
                    'details'=>'test',
                    'address'=>'hello',
                    'status'=>'1',
                    ...
                  )
            )
    )