Laravel Eloquent API 资源中的条件响应



Laravel 5.7.我有一个模型Audio,字段idtitle。一个Audio可以有很多AudioVersion,其中AudioVersionidaudio_id(指Audio(和url

现在,我有两个父模型,FooBar,它们可以有很多Audio模型。

音频:

class Audio extends Model
{
public function versions()
{
return $this->hasMany('AppAudioVersion', 'audio_id');
}
}

音频版本:

class AudioVersion extends Model
{
public function audio()
{
return $this->belongsTo('AppAudioContent');
}
}

福:

class Foo extends Model
{
public function audioContents()
{
return $this->morphToMany('AppAudio', 'audio_contentable', 'audio_contentable');
}
}

我有一个雄辩的 API 资源,FooResource,它返回其Audio对象:

FooResource:

class FooResource extends JsonResource
{
public function toArray($request)
{
return [
'audio' => AudioResource::collection($this->audioContents),
];
}
}

音频资源:

class AudioResource extends JsonResource
{
public function toArray($request)
{
return [
'urls' => $this->versions,
];
}
}

我的问题是,在FooResourceaudio键中,我只想返回Audio与它们AudioVersions相关的文件。 也就是说,如果我有一个没有AudioVersionsAudio,我不希望该Audio包含在Fooaudio键中。我找不到一种方法来在雄辩/资源中执行这种深层条件逻辑。

FooResource类中,可以在将集合传递给集合方法之前filter()集合。

class FooResource extends JsonResource
{
public function toArray($request)
{
$audioContents = $this->audioContents()->filter(function($audio, $key) {
return $audio->versions->count();
}
return [
'audio' => AudioResource::collection($audioContents),
];
}
}

你需要做这样的事情。这是一个例子,你只需要在with中添加join,这样只会获取那些audios具有audio versions

$audioContents = AudioContents::with([
'audio' => function ($query) use ($SpecificID) {
return $query->join("audio_versions")
->on("audio_versions.audio_id", "=", "audios.id");
}
])->get();

试试这个,如果你遇到任何问题,让我知道。

最后我为Audio添加了一个范围:

public function scopeHasVersions($query)
{
return $query->whereHas('versions');
}

然后在FooResource

return [
'audio' => AudioResource::collection($this->audioContents()->hasVersions()->get()),
];

最新更新