【问题标题】:HasManyThrough with one-to-many relationship具有一对多关系的 HasManyThrough
【发布时间】:2014-07-10 10:18:32
【问题描述】:

我正在为一个带有如下表格的项目开发小型 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 = ?;

谢谢!

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    你不能用内置方法做到这一点,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
    

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

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2019-03-26
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多