Красноречивая загрузка нескольких глубин с запросами - PullRequest
0 голосов
/ 03 ноября 2018

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

Что я пытался сделать: Я работаю над проектом, в котором у меня нет достаточного контроля над макетами таблиц, что касается типов полей. Я должен быть очень осторожным относительно того, как я их структурирую, потому что он интегрируется в существующий проект. В рамках этой интеграции мне приходится работать с чрезмерной нормализацией. Проблема, с которой я столкнулся, заключается в том, что существует множество нормализованных таблиц, которые имеют множество отношений в разных направлениях.

Мутный песок:

Модели - Клиент, Инвестиции, Документы и многое другое

Проблема заключалась в том, что я хотел загрузить модель Клиента инвестициями с документами. Мне нужно было загрузить клиентскую модель для текущего клиента только с инвестициями для текущей выбранной инвестиции и всеми документами для этой инвестиции.

Модели:

//Clients Model
class Client extends Authenticatable
{
    public function investments()
    {
        // A client can have many investments
        return $this->belongsToMany('App\Models\Investment\Investment');
    }

    public function investmentDocuments()
    {
        // A Client can have many Investment Documents
        return $this->belongsToMany('App\Models\Investment\Investmentdocument');
    }
}

// Investments Model
class Investment extends Model
{
    public function clients()
    {
        // An Investment can belong to many Clients
        return $this->belongsToMany('App\Models\Client');
    }

    public function documents()
    {
        // An Investment can have many Investment Documents
        return $this->hasMany('App\Models\Investment\Investmentdocument');
    }
}

// Documents Model
class Investmentdocument extends Model
{
    public function client()
    {
        // An Investment Document can belong to more than one Client
        return $this->belongsToMany('App\Models\Client');
    }

    public function investment()
    {
        // An Investment Document belongs to one Investment
        return $this->belongsTo('App\Models\Investment\Investment');
    }
}

Стремительная нагрузка:

$client = Client::where('id',\Auth::user()->id)->with([
   'investments' => function ($q) use($request) {
      $q->find($request->investmentid);
   },'investments.documents'])->first();

Используя этот метод, я смог получить хороший доход от Клиентов-> Инвестиции-> Документы, чтобы я мог аккуратно создавать новые документы, которые будут автоматически принадлежать Инвестициям, которые принадлежат Клиентам. Возможно, это не самый лучший метод, но он работает и требует много усилий, а это то, чего я действительно пытался достичь. Этот сайт будет получать много трафика, и я не могу сэкономить ресурсы, совершающие несколько звонков.

Если у кого-то есть другой способ сделать это, не перестраивая таблицы или модели (слишком много), не стесняйтесь комментировать. Я открыт для предложений. Я просто хотел поделиться этим на случай, если кто-то другой попытается сделать то же самое, что и я.

...