【问题标题】:Laravel Nova Override BelongsTo Language field based on already translated resources基于已翻译资源的 Laravel Nova Override BelongsTo Language 字段
【发布时间】:2019-01-09 17:31:55
【问题描述】:

想象以下 3 个带有字段的模型:

Listing:
id

ListingTranslation:
id
listing_id
language_id
title

Language:
name
iso

在我的 ListingTranslation 创建/更新表单中,如何过滤 语言选择器 以不显示已翻译的语言?

(即,如果我有 2 种语言 ES(id 1)和 EN(id 2),并且如果我有一个 id 为 1 的列表并且该列表已经有一个 id 为 1、listing_id 1 和 language_id 1 的列表翻译,语言选择器应该只显示 EN 作为一个选项)。

语言选择器

BelongsTo::make('Language')

Laravel Nova documentation 提供以下方法来过滤用于填充关系模型选择菜单的查询:

    public static function relatableQuery(NovaRequest $request, $query)
    {
         return $query->where('user_id', $request->user()->id);
    }

但是,我不知道如何通过这种方法访问诸如 Listing_id 之类的东西。

【问题讨论】:

    标签: laravel laravel-nova


    【解决方案1】:

    您可以使用BelongsToMany 关系,而不是为数据透视表ListingTranslation 创建 Nova 资源。

    Listing Nova 资源字段下添加BelongsToMany::make('Languages')。假设您已经在 Listing 模型中定义了关系。

    此时当你附加一个已经附加的语言时,你会看到一个错误信息The language is already attached

    但如果您仍想停止列出已附加的语言,您可以在Listing nova 资源下添加relatableQuery

    public static function relatableLanguages(NovaRequest $request, $query)
    {
        $listing = $request->findResourceOrFail();
    
        return $query->whereNotIn('id', $listing->languages->pluck('id'));
    }
    

    希望这会对你有所帮助。

    【讨论】:

    • 感谢您的回复,我需要 Listing 和 ListingTranslation 之间的关系才能检索给定列表的可用翻译。因此,您的 relatableLanguage 方法应该在 ListingTranslation 资源中。你知道如何在ListingTranslation中实现吗?
    猜你喜欢
    • 2019-12-08
    • 2020-05-27
    • 2021-03-19
    • 1970-01-01
    • 2022-08-05
    • 2019-06-19
    • 2019-03-08
    • 2023-04-04
    • 2019-08-16
    相关资源
    最近更新 更多