Я удалил предыдущий ответ, так как здесь дублирую.Я полагаю, что вы можете использовать собственный метод сбора для достижения желаемых результатов для конкретной страницы, сохраняя при этом красноречивый стиль ответа и сохраняя свой вызов довольно простым.Кажется, это работает для меня.
К сожалению, я не верю, что можно строго выполнять то, что вы просите, с красноречивыми связями, потому что, как только вы попадете в модули, у вас не будет никакого способа достичьназад ", чтобы получить идентификатор страницы.
Вы заметите, что есть два метода withModuleSettings()
, один для коллекции страниц и один для отдельной страницы.
Создайте новый файл:
App / PageCollection.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Collection;
class PageCollection extends Collection
{
// this will load the module settings based on page id
public function withModuleSettings()
{
foreach ($this as $p => $page) {
$this[$p]->withModuleSettings();
}
return $this;
}
}
Ваши модели:
class Page extends Model
{
// ...
public function modules()
{
return $this->belongsToMany(Module::class)->withPivot('module_instance');
}
// override the default collection instance with our own
public function newCollection(array $models = [])
{
return new PageCollection($models);
}
// this will load the module settings based on page id
public function withModuleSettings()
{
// this page id
$id = $this->id;
foreach ($this->modules as $m => $module) {
// get module instance from pivot
$instance = $module->pivot->module_instance;
// load relations
$this->modules[$m]->load(['settings' => function($query) use ($id, $instance) {
$query
->where('module_settings.page_id',$id)
->where('module_settings.module_instance',$instance)
;
}]);
}
return $this;
}
}
class Module extends Model
{
// ...
public function settings()
{
return $this->hasManyThrough(
ModuleSetting::class,
ModulePage::class,
'module_id', // first key
'module_instance', // second key
'id', // local key
'module_instance' // second local key
);
}
}
class ModulePage extends Model
{
// define the table name since Laravel expects it to be 'module_pages'
protected $table = 'module_page';
}
class ModuleSetting extends Model
{
// ...
}
Действие:
$pages = Page::with('modules')->get()->withModuleSettings();
Работает и с отдельными страницами:
$page = Page::with('modules')->first()->withModuleSettings();