Laravel Nova Override属于基于已翻译资源的“语言”字段

时间:2019-01-09 17:31:56

标签: laravel laravel-nova

想象以下三种带有字段的模型:

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_translation,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之类的东西。

1 个答案:

答案 0 :(得分:0)

您可以使用ListingTranslation关系来代替为数据透视表BelongsToMany创建Nova资源。

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

此时,当您附加一种已经附加的语言时,您将看到一条错误消息The language is already attached

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

public static function relatableLanguages(NovaRequest $request, $query)
{
    $listing = $request->findResourceOrFail();

    return $query->whereNotIn('id', $listing->languages->pluck('id'));
}

希望这会对您有所帮助。