Как запросить полиморфную модель Eloquent, указав тип и идентификатор? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть полиморфная модель Discussion и другие модели, discussable.

Я настроил свою карту морфинга для перевода project в App\Models\Company\Project, что discussable.

Я хотел бы написать:

function get_all_discussions($type, $id) 
{
    return Discussion::orderBy('created_at', 'desc')
        ->where('discussable_type', $type)
        ->where('discussable_id', $id)
        ->get();
}

get_all_discussion('project', 1232);

К сожалению ->where('discussable_type', $type) не работает с картой морфа.

Мое текущее решение - использовать этот ключ:

function getMorphType($typeOrClass)
{
    $morphMap = array_flip(\Illuminate\Database\Eloquent\Relations\Relation::morphMap());

    return array_get($morphMap, $typeOrClass, $typeOrClass);
}

1 Ответ

0 голосов
/ 05 июня 2019

Лучшим подходом может быть определение отношений в моделях: https://laravel.com/docs/5.8/eloquent-relationships#polymorphic-relationships

Например, я получил Project и Issue, две модели, которые можно обсуждать.

class Project
{
    public function discussions()
    {
        return $this->morphMany(Discussion::class, 'discussable');
    }
}
class Issue
{
    public function discussions()
    {
        return $this->morphMany(Discussion::class, 'discussable');
    }
}

Тогда, если вы хотите получить все обсуждения для проекта или вопроса:

$project = Project::findOrFail(101);
$issue = Issue::findOrFail(102);

$project->discussions;
$issue->discussions;
...