首页 > 解决方案 > 如何查询提供类型和 id 的多态 Eloquent 模型?

问题描述

我有一个多态模型Discussion和其他模型discussable

我已将我的变形图配置为转换project为.App\Models\Company\Projectdiscussable

我想写:

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)的是,它不适用于变形贴图。

我目前的解决方案是使用这个 kludge:

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

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

标签: phplaraveleloquentrelationshippolymorphic-associations

解决方案


更好的方法可能是在模型中定义关系: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;

推荐阅读