【问题标题】:Laravel 5.5 - Polymorphic relationshipsLaravel 5.5 - 多态关系
【发布时间】:2017-11-16 02:39:22
【问题描述】:

假设我在 Laravel 中有四个表(模型):

User.php

id - integer
name - string

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'token_id'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function embeds()
    {
        return $this->hasManyThrough('App\Post', 'App\Role');
    }
}

UserRoles.php

id - integer
user_id - integer
role_id - integer

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class UserRoles extends Pivot
{
    protected $guarded = [];

    public function role()
    {
        return $this->belongsTo(Role::class);
    }

    public function user()
    {
        return $this->belongsToMany(User::class, 'user_id');
    }
}

Role.php

id - integer
name - string

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    /**
     * Don't auto-apply mass assignment protection.
     *
     * @var array
     */
    protected $guarded = [];

    public function roles()
    {
        return $this->belongsToMany(UserRoles::class);
    }
}

Post.php

id - integer
title - string
body - text
role_id - integer

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * Don't auto-apply mass assignment protection.
     *
     * @var array
     */
    protected $guarded = [];
}

如您所见,UserRoles 是将UsersRoles 连接起来的数据透视表。而Posts 只能与一个角色相关联(技术规范要求)。

如何在 Eloquent 中建立关系,以便我可以让用户通过分配给他们的 Roles 获得他们可以看到的每一个 Post

我已经修改了 Laravel 关系文档的查看,并且我看到了 Many-to-Many 多态关系,但似乎我不断得到:SQLSTATE[42S02]: Base table or view not found: 1146 Table 或某种形式。

我做错了什么?

【问题讨论】:

  • 你能分享你的模型吗?确切地说,您如何定义关系
  • @Hamoud 完成。对此感到抱歉。

标签: php laravel


【解决方案1】:

嗯,数据透视表确实需要模型。您需要四个表和三个模型。

你几乎把桌子弄对了。只需将UserRole 表重命名为role_user 即可关注Laravel convention

role_user 表由相关模型名称的字母顺序派生而来,包含 user_id 和 role_id 列。

以下是您应该如何设置模型:

// User.php

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

    public function posts()
    {
        return $this->hasManyThrough(Post::class, Role::class);
    }

// Role.php

    public function users()
    {
        return $this->belongsToMany(User::class);
    }


    public function posts()
    {
        return $this->hasMany(Post::class);
    }

【讨论】:

  • 表是user_roles,模型是UserRoles,所以……模型应该是RoleUser,db_table是role_user
  • 我得到SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mangsysd.user_role' doesn't exist (SQL: select * from user_role` 其中user_id = 1 limit 1)`
  • 我得到SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.user_id' in 'field list' (SQL: select posts.*, roles.user_id`来自posts内部连接rolesroles.id = posts.@98765@4 987654340@.user_id = 1)` 关注您的帖子。
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2018-07-11
  • 2018-03-07
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多