Итак, это для всех, кому интересно, как загружать модели на несколько глубин с быстрой загрузкой через 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();
Используя этот метод, я смог получить хороший доход от Клиентов-> Инвестиции-> Документы, чтобы я мог аккуратно создавать новые документы, которые будут автоматически принадлежать Инвестициям, которые принадлежат Клиентам. Возможно, это не самый лучший метод, но он работает и требует много усилий, а это то, чего я действительно пытался достичь. Этот сайт будет получать много трафика, и я не могу сэкономить ресурсы, совершающие несколько звонков.
Если у кого-то есть другой способ сделать это, не перестраивая таблицы или модели (слишком много), не стесняйтесь комментировать. Я открыт для предложений. Я просто хотел поделиться этим на случай, если кто-то другой попытается сделать то же самое, что и я.