Laravel 5.7.我有一个模型Audio
,字段id
和title
。一个Audio
可以有很多AudioVersion
,其中AudioVersion
有id
、audio_id
(指Audio
(和url
。
现在,我有两个父模型,Foo
和Bar
,它们可以有很多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,
];
}
}
我的问题是,在FooResource
的audio
键中,我只想返回Audio
与它们AudioVersions
相关的文件。 也就是说,如果我有一个没有AudioVersions
的Audio
,我不希望该Audio
包含在Foo
的audio
键中。我找不到一种方法来在雄辩/资源中执行这种深层条件逻辑。
在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()),
];