想象以下三种带有字段的模型:
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之类的东西。
答案 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'));
}
希望这会对您有所帮助。