Eloquent(某种)三重关系

Eloquent (kind of) triple relationship

我很难找到一个简单的解决方案,使用 Eloquent 关系,我有 3 个模型:

现在一个User有很多Categories,一个Category只有一个用户。一个用户有很多物品,一个物品有很多用户。最后一个项目有很多类别,许多类别有很多项目。棘手的部分是,虽然一个项目可以有多个类别,但它只能有一个来自每个用户的类别,因此反过来就是用户只能将他拥有的一个类别关联到该项目。

项目和用户 (item_user) 之间的枢轴 table 也有两个属性,boolean is_owner tinyInt 权限

在我的申请过程中,我始终拥有用户 ID

我想检索属于用户的费用,实现如下:

[
    {
        "id": "1",
        "value": "0.40",
        "description": "Expense 0",
        "category": {
            "id": "1",
            "name": "Health",
            "created_at": {
                "date": "2015-04-15 01:33:05",
                "timezone_type": 3,
                "timezone": "UTC"
            },
            "update_at": {
                "date": "2015-04-15 01:33:05",
                "timezone_type": 3,
                "timezone": "UTC"
            }
        },
        "users": [
            {
                "id": "1",
                "name": "Fabio",
                "email": "fabioantuness@gmail.com",
                "permissions": {
                    "expense_id": "1",
                    "user_id": "1",
                    "is_owner": "1",
                    "permissions": "6"
                }
            }
        ]
    },
    {
        "id": "2",
        "value": "12.40",
        "description": "Expense 1",
        "category": {
            "id": "1",
            "name": "Health",
            "created_at": {
                "date": "2015-04-15 01:33:05",
                "timezone_type": 3,
                "timezone": "UTC"
            },
            "update_at": {
                "date": "2015-04-15 01:33:05",
                "timezone_type": 3,
                "timezone": "UTC"
            }
        },
        "users": [
            {
                "id": "1",
                "name": "Fabio",
                "email": "fabioantuness@gmail.com",
                "permissions": {
                    "expense_id": "2",
                    "user_id": "1",
                    "is_owner": "1",
                    "permissions": "6"
                }
            }
        ]
    }
]

物品型号:

class Item extends Model {

    protected $fillable = ['category_id', 'value', 'description'];

    public function users()
    {
        return $this->belongsToMany('App\User')->withPivot('is_owner', 'permissions');
    }

    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }

}

用户模型:

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

    use Authenticatable, CanResetPassword;

    protected $table = 'users';
    protected $fillable = ['name', 'email', 'password'];
    protected $hidden = ['password', 'remember_token'];

    public function categories()
    {
        return $this->hasMany('App\Category');
    }

    public function items()
    {
        return $this->belongsToMany('App\Item')->withPivot('is_owner', 'permissions');
    }

    public function tokens()
    {
        return $this->hasMany('App\Token');
    }

}

类别模型:

class Category extends Model {

    protected $fillable = ['name'];

    public function user(){
        return $this->belongsTo('App\User');
    }

    public function items()
    {
        return $this->belongsToMany('App\Item');
    }
}

在 Whosebug 上对问题进行图解帮助我找到了解决方案,这里是查询:

User::expenses()->with(
    [
        'users',
        'categories' => function ($query) use ($userId)
        {
            $query->where('user_id', $userId);
        }
    ]
)->get()->all();

如果谁有更好的解决方案欢迎分享