我有一个复杂的数据模型,我正在尝试使用 Laravel 5/Eloquent 编写查询,而不仅仅是普通的 SQL。我下面的 SQL 可以工作,但我喝了 kool-aid,我想让它以“正确”的方式工作。
有一个many to many relationship Actor 和姿势之间和 many to many polymorphic relationship姿势和类别之间。
我想做的是通过 Actor 的姿势获取与 Actor 相关的所有不同类别的列表。
SQL
SELECT DISTINCT
categories.name,
categories.parent_id
FROM
actor_pose
JOIN
poses ON poses.id = actor_pose.pose_id
JOIN
categorizables ON categorizables.categorizable_id = poses.id
JOIN
categories ON categories.id = categorizables.category_id
WHERE
actor_pose.actor_id = 1 AND
categorizables.categorizable_type = "App\\Pose"
ORDER BY
parent_id
数据库
Actor ID 姓名
姿势 ID 姓名
类别 ID 姓名 父ID
可分类 类别_id 可分类_id 可分类_类型
代码
CategorizedTrait.php
<?php namespace App;
trait CategorizableTrait {
public function categories()
{
return $this->morphToMany('App\Category', 'categorizable');
}
}
Pose.php
<?php namespace App;
class Pose extends Model
{
use CategorizableTrait;
public function actors()
{
return $this->belongsToMany('App\Actor')->withTimestamps();
}
}
Actor.php
<?php namespace App;
class Actor extends Model
{
public function poses()
{
return $this->belongsToMany('App\Pose')->withTimestamps();
}
最佳答案
链接到SoftOnSofa来自Jarek Tkaczyk我最终使用了一个干净的解决方案。
我将此方法添加到我的 Actor.php 文件中。
Actor.php
public function getCategoriesAttribute()
{
$categories = new Collection;
$this->load(['poses.categories' => function ($q) use ( &$categories ) {
$categories = $q->get()->unique();
}]);
return $categories->sortBy('order')->sortBy('parent_id');
}
Controller 没有做任何特殊的事情。在 Blade 中,您可以按如下方式访问它。
index.blade.php
@foreach($actor->categories as $key => $category)
{{ $category->name }}
@endforeach
关于php - 我如何获得通过与 Laravel 5/Eloquent 的两个多对多关系关联的不同类别列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30359555/