【问题标题】:Laravel pivot tables n:m relationshipsLaravel 数据透视表 n:m 关系
【发布时间】:2014-09-29 13:30:06
【问题描述】:

我有一张桌子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');
    }

}

数据透视表迁移,

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 未知列 'where 子句'中的'clients.organisation_id'(SQL:select * from clients 其中clients.organisation_id 为空)

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

【问题讨论】:

  • clients 关系应该是 belongsToMany 而不是 hasMany
  • 已更改,但查询仍在寻找 'clients.organisation_id'

标签: php database laravel eloquent pivot-table


【解决方案1】:

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

class Organisation extends Eloquent {

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

}

class Client extends Eloquent {

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

}

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

【讨论】:

  • 啊,很好,摆脱了错误,但返回 Illuminate\Database\Eloquent\Collection Object ( [items:protected] => Array ( ) ) 我期待一个组织和客户的对象
  • 原因是使用了类名。 ClientOrganisation 在关系中。
  • @Cycs - 你到底在写什么代码,你期待什么?
  • @Cycs - 这正是你得到的:你的对象的集合。你还想要什么?
  • @Cycs - 您打算如何将关系加载到不存在的条目中?
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2021-03-09
  • 2016-08-04
  • 2013-11-17
  • 2019-12-21
  • 2020-08-22
相关资源
最近更新 更多