拥有一对多关系 [英] HasManyThrough with one-to-many relationship

查看:143
本文介绍了拥有一对多关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

   - 页面
- id
...
- 翻译
- page_id
...
- 菜单
- id
...
- menu_page
- menu_id
- page_id
...

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

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

是否可以直接在菜单和翻译之间创建一个关系,像这样的SQL查询:

 选择翻译。* 
从翻译
内连接menu_page在menu_page.page_id = translations.page_id
其中menu_page.menu_id =?;

谢谢!

解决方案

你不能用内置方法来执行此操作, hasManyThrough 不能与多对多关系菜单 - 页面一起使用。



但是,您可以尝试以下解决方法:

  public function getTranslationsAttribute()
{
if(!array_key_exists('translations',$ this-> relationship))$ 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([ 。翻译*, '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; //雄辩的翻译模型集合

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


I am working on small scale CMS for a project with tables like so:

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

In the Menu model I have this relationship:

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

Is it possible to create a relation directly between Menu and Translations that translates to something like this SQL query:

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

Thanks!

解决方案

You can't do it with builtin methods, hasManyThrough won't work with many-to-many relation menus-pages.

However you can try a workaround like this:

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;
}

Now you can do this:

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

So basically just like you would use any relation. The only trouble is that you can't eager load it.

这篇关于拥有一对多关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆