首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一对多关系的HasManyThrough

一对多关系的HasManyThrough
EN

Stack Overflow用户
提问于 2014-05-21 16:23:24
回答 1查看 3.3K关注 0票数 4

我正在为一个具有如下表的项目做小规模的CMS工作:

代码语言:javascript
复制
- pages
    - id
    …
- translations
    - page_id
    …
- menus
    - id
    …
- menu_page
    - menu_id
    - page_id
    …

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

代码语言:javascript
复制
function pages(){
    return $this->hasMany('Page');
}

是否可以在菜单和转换之间直接创建关系,从而将其转换为类似于以下SQL查询的内容:

代码语言:javascript
复制
select translations.* 
from translations
inner join menu_page on menu_page.page_id = translations.page_id
where menu_page.menu_id = ?;

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2014-05-21 16:41:51

你不能用内置的方法来做,hasManyThrough不会处理很多到多个关系菜单-页面。

但是,您可以尝试这样的解决方法:

代码语言:javascript
复制
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;
}

现在你可以这样做了:

代码语言:javascript
复制
$menu = Menu::find($id);
$menu->translations; // Eloquent Collection of Translation models

所以基本上就像你会用任何关系。唯一的问题是你不能急于装载它。

票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23788844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档