从 L4 中的枢轴 table 计算 eloquent 关系

Counting eloquent relations from pivot table in L4

我有以下 tables:

用户

    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('username', 30);
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->string('remember_token')->nullable();
        $table->timestamps();
    });

组织

    Schema::create('organisations', function(Blueprint $table)
    {
        $table->increments('id');
        $table->string('name')->unique('name');
        $table->integer('owner_id')->unsigned()->index()->nullable();
        $table->foreign('owner_id')->references('id')->on('users');
        $table->timestamps();
    });

这是我的 organisation_user 支点 table:

public function up()
{
    Schema::create('organisation_user', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('organisation_id')->unsigned()->index();
        $table->foreign('organisation_id')->references('id')->on('organisations')->onDelete('cascade');
        $table->integer('staff_id')->unsigned()->index();
        $table->foreign('staff_id')->references('id')->on('users')->onDelete('cascade');
    });
}

我的模型规则是:

因此,我的 Organisation eloquent 模型如下所示:

class Organisation extends Eloquent {

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function owner()
    {
        return $this->belongsTo('User', 'owner_id', 'id');
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function staffs()
    {
        return $this->hasMany('User', 'staff_id', 'id');
    }

}

这是我在控制器中加载模型并将其传递给视图的方式:

public function index()
{
    return View::make('organisations.index')
        ->with('organisations', Organisation::with('owner', 'staffs')->get());
}

在我看来,我这样显示数据:

@foreach($organisations as $organisation)
    <div>
        Name : {{  $organisation->name }}
        <br>
        Owner: {{ $organisation->owner->email }}
        <br>
        Staffs: {{ $organisation->staffs->count() }}
    </div>
@endofreach

执行上面的代码时,出现以下错误:

SQLSTATE[42S22]:未找到列:1054 'where clause' 中的未知列 'users.staff_id'(SQL:select * 来自 users 其中 users.staff_id 在 (1))

知道为什么我在这里做错了吗?你link如何正确处理与预加载的关系?

我需要一个单独的枢轴模型 table 才能工作吗?

在我看来 staffs 实际上是 many-to-many relationship。这意味着你需要 belongsToMany()

public function staffs()
{
    return $this->belongsToMany('User', 'organisation_user', 'organisation_id', 'staff_id');
}

多对多关系使用 belongsToMany() 方法,而不是 hasMany() 方法。

更新您的代码:

class User extends Eloquent
{
    public function staffs()
    {
        return $this->belongsToMany('Organisation', 'organisation_user', 'staff_id','organisation_id');
    }
}

也在视图中,试试这个 Staffs: {{ $organisation->staffs()->count() }}

请注意,唯一的变化是向工作人员添加了 (),我自己无法测试此代码,但根据我的记忆,->staffs 方法会 return 和 Eloquent\Collection 所有相关模型 (Users) 和 () 将 return 您在模型中的关系方法中定义的 hasMany() 对象,与Eloquent\Collection

仔细检查 Eloquent 关于多对多关系的文档。