HasManyThrough 具有一对多关系

2024-01-05

我正在为一个项目开发小型 CMS,其表如下:

- pages
    - id
    …
- translations
    - page_id
    …
- menus
    - id
    …
- menu_page
    - menu_id
    - page_id
    …

在菜单模型中我有这样的关系:

function pages(){
    return $this->hasMany('Page');
}

是否可以直接在 Menu 和 Translations 之间创建一个关系,将其转换为如下 SQL 查询:

select translations.* 
from translations
inner join menu_page on menu_page.page_id = translations.page_id
where menu_page.menu_id = ?;

Thanks!


你不能用内置方法来做到这一点,hasManyThrough不适用于多对多关系菜单页面。

不过您可以尝试这样的解决方法:

public function getTranslationsAttribute()
{
    if ( ! array_key_exists('translations', $this->relations)) $this->loadTranslations();

    return $this->getRelation('translations');
}

protected function loadTranslations()
{
    $translations = Translation::join('menu_page', 'translations.page_id', '=', 'menu_page.page_id')
        ->where('menu_page.menu_id', $this->getKey())
        ->distinct()
        ->get(['translations.*','menu_id']);

    $hasMany = new Illuminate\Database\Eloquent\Relations\HasMany(Translation::query(), $this, 'menu_id', 'id');

    $hasMany->matchMany(array($this), $translations, 'translations');

    return $this;
}

现在你可以这样做:

$menu = Menu::find($id);
$menu->translations; // Eloquent Collection of Translation models

所以基本上就像你会使用任何关系一样。唯一的麻烦是你不能急切地加载它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HasManyThrough 具有一对多关系 的相关文章

随机推荐