Eloquent很多对很多用Pivot表来重构返回到特定数组的结果

时间:2017-05-30 12:23:55

标签: laravel eloquent laravel-5.4

我有一个数据透视表,用于存储数据以同步其他三个表

Table

我有一个函数将返回基于特定字段的行,例如device_id

public function getDeviceReleasesByProfileId($profile_id)
{
    try {
        $profile = Profile::find($profile_id);
        if (!$profile) {
            return $this->respondNotFound('Profile not found');
        }
        $profile_releases = DeviceProfileRelease::where('profile_id', '=', $profile_id)->get();

        // Refactor to array here. 

        return $this->respondWithSuccess($profile_releases);
    } catch (\Exception $error) {
        return $this->respondInternalError($error->getMessage());
    }
}

我需要做的是获得目前的结果 [ { "device_id": 19, "profile_id": 7, "release_id": 1 }, { "device_id": 19, "profile_id": 7, "release_id": 2 }, { "device_id": 19, "profile_id": 7, "release_id": 3 }, { "device_id": 19, "profile_id": 7, "release_id": 4 } ]

我希望实现的是对于每个结果,使用 $profile_releases->release()->get()方法将结果更改为版本列表而不是透视值数组。我的问题是,我是否以错误的方式构建了数据透视表,并且有一种方法可以重构它以获得最佳性能和更好的代码。

我知道可以这样做,

        $releases = array();
        foreach ($profile_releases as $profile_release)
        {
            $release_search = Release::find($profile_release->release_id);
            $releases[] = $release_search;
        }

我只是想看看是否有人对更好的方法有任何其他想法,这感觉不对

1 个答案:

答案 0 :(得分:0)

public function getDeviceReleasesByProfileId($profile_id)
{
    try {
        $profile = Profile::find($profile_id);
        if (!$profile) {
            return $this->respondNotFound('Profile not found');
        }
        $profile_releases = DeviceProfileRelease::where('profile_id', '=', $profile_id)->get();
        $release_ids = array();
        foreach ($profile_releases as $profile_release)
        {
            $release_ids[] = $profile_release->release_id;
        }
        $repository = app('App\Interfaces\ReleaseRepository');
        $repository->setPresenter(ReleasePresenter::class);
        $releases = $repository->find($release_ids);

        return $this->respondWithSuccess($releases);
    } catch (\Exception $error) {
        return $this->respondInternalError($error->getMessage());
    }
}