gpt4 book ai didi

laravel - HasManyThrough 具有一对多关系

转载 作者:行者123 更新时间:2023-12-02 12:45:23 26 4
gpt4 key购买 nike

我正在为一个项目开发小型 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 = ?;

谢谢!

最佳答案

您无法使用内置方法来做到这一点,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

所以基本上就像您使用任何关系一样。唯一的麻烦是你不能立即加载它。

关于laravel - HasManyThrough 具有一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com