0

拉拉维尔 5.7。我有一个模型Audio,带有字段idtitle. 一个Audio可以有很多AudioVersions,其中AudioVersionidaudio_id(指Audio)和url

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

声音的:

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

音频版本:

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

福:

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

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

Foo资源:

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,
        ];
    }
}

我的问题是,在我的audio关键中,我FooResource只想返回与它们相关Audio的 s 。AudioVersions即,如果我有一个Audiowith no AudioVersions,我不希望它Audio包含在Foo'saudio键中。我找不到在 Eloquent / Resources 中执行这种深度条件逻辑的方法。

4

3 回答 3

1

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),
        ];
    }
}
于 2018-09-13T10:50:53.277 回答
0

你需要做这样的事情。这是示例,您只需要在内部添加连接,with以便仅audios获取具有audio versions.

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

试试这个,如果您遇到任何问题,请告诉我。

于 2018-09-13T10:41:35.717 回答
0

最后,我添加了一个范围Audio

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

然后在FooResource

return [
    'audio' => AudioResource::collection($this->audioContents()->hasVersions()->get()),
];
于 2018-09-13T10:53:00.487 回答