Laravel透视表n:m关系

时间:2014-08-06 14:41:17

标签: php database laravel eloquent pivot-table

我有表organisations和另一个表clients。组织可以拥有许多客户端,客户端可以属于许多组织,因此可以属于多对多关系和数据透视表client_organisation

在我的模型Organisation.php中,我有以下内容,

class Organisation extends Eloquent {

    //Organisation __has_many__ clients
    public function clients()
    {
        return $this->hasMany('client');
    }

}

在我的Client.php模型中,

class Client extends Eloquent {

    public function organisations()
    {
        return $this->belongsToMany('organisation');
    }

}

数据透视表迁移,

<?php

使用Illuminate \ Database \ Migrations \ Migration; 使用Illuminate \ Database \ Schema \ Blueprint;

类CreateClientOrganisationTable扩展了Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('client_organisation', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('client_id')->unsigned()->index();
        $table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');
        $table->integer('organisation_id')->unsigned()->index();
        $table->foreign('organisation_id')->references('id')->on('organisations')->onDelete('cascade');
        $table->timestamps();
    });
}


/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('client_organisation');
}

}

然后我在我的控制器中运行以下命令,以检索所有组织和客户端,

$organisations = new Organisation;  
$organisations->clients()->get();

然而,这会导致以下错误,

  

SQLSTATE [42S22]:找不到列:1054未知列   'where子句'中的'clients.organisation_id'(SQL:select * from   clients clients organisation_id为空{}。

现在我的理解是,我的数据库中不需要clients.organisation_id列,因为我有一个数据透视表,我做错了什么?我希望能够使用数据透视表获取我的所有组织及其客户。

1 个答案:

答案 0 :(得分:2)

要使用数据透视表,您应该在关系的两端使用belongsToMany

class Organisation extends Eloquent {

    public function clients()
    {
        return $this->belongsToMany('Client');
    }

}

class Client extends Eloquent {

    public function organisations()
    {
        return $this->belongsToMany('Organisation');
    }

}

请注意,belongsToMany的第一个参数是类的名称,它是大写的。