提问者:小点点

Laravel数据透视表n:m关系


我有一个表组织和另一个表客户。一个组织可以有多个客户,并且一个客户可以属于多个组织,因此多对多关系和透视表client\u organization

在我的模型组织中。php我有以下几点:,

class Organisation extends Eloquent {

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

}

在我的客户机中。php我拥有的模型,

class Client extends Eloquent {

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

}

数据透视表迁移,

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreateClientOrganisationTable extends 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未知列'clients.organisation_id'in'where子句'(SQL:选择*from客户端where客户端.organisation_id为空)

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


共1个答案

匿名用户

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

class Organisation extends Eloquent {

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

}

class Client extends Eloquent {

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

}

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