Laravel Models Pivot表1-1关系应该是1-M

时间:2015-03-11 07:07:14

标签: php html mysql laravel laravel-4

我的Laravel模型有问题,我正在尝试使用我已经在数据库中使用的数据透视表,这是我正在使用的表的布局

客户端 The "clients" table

作业 The "jobs" table

客户端的作业 The "clients-jobs" table

我相信错误在我的模型中,我并不完全理解雄辩的语法,但我一直在尝试其他几种方法。我想将主要文件保留在clients-jobs表中,以便更容易编制索引。

这是我的模特: 客户端

protected $table = 'clients';
public $timestamps = true;
protected $primaryKey = "id";

public function clientsjobs() {
    return $this->belongsTo('ClientsJobs');
}

工作

protected $table = 'jobs';
protected $fillable = array('first_name', 'last_name', 'email');
protected $primaryKey = "id";


public function clientsjobs() {
    return $this->belongsToMany('ClientsJobs');
}

ClientsJobs(也许我应该删除这个模型?我使用它吗?)

protected $table = 'clients-jobs';
protected $primaryKey = "id";

public function clients() {
    return $this->hasOne('Client', 'id');
}
public function jobs() {
    return $this->hasOne('Job', 'id');
}

我用来尝试显示clients-jobs表的所有记录的代码就在我的一个控制器中(感谢sebastien):

$masterArray = array();
    ClientsJobs::with('clients', 'jobs')->chunk(200, function($records) use (&$masterArray) { //Chunk Retrieves 200 Records at a time
        foreach ($records as $record) {
            $masterArray[] = array(
                'id'          => $record->id,              // id
                'client_name' => !empty($record->clients) ? $record->clients->fname : "Unknown",
                'job_name'    => !empty($record->jobs) ? $record->jobs->name : "Unknown",
                'wage'        => $record->wage,
                'productivity'=> $record->productivity,
            );
        }
    });
    return $masterArray;

此代码适用于前两个记录,但在此之后“未知”,我很确定这是因为应用程序认为它是1:1的关系(我只有2个用户和2个作业作为虚拟数据)。

先谢谢你提出的任何建议,如果你看到我做过的令人讨厌的事情,请告诉我

1 个答案:

答案 0 :(得分:2)

您应该删除ClientsJobs模型,这是不必要的。 Laravel的belongsToMany关系,如果设置正确,将处理数据透视表本身。看看:

http://laravel.com/docs/4.2/eloquent

  

多对多关系是一种更复杂的关系类型。一个   这种关系的一个例子是具有许多角色的用户,其中   角色也由其他用户共享。例如,许多用户可能拥有   “管理员”的角色。为此需要三个数据库表   relationship:users,roles和role_user。 role_user表是   从相关模型名称的字母顺序派生而来   应该有user_id和role_id列。

您的数据透视表应该以Laravel的惯例命名,即使用每个模型名称(Singular)并使用下划线字符(client_job)将它们连接在一起,或者您可以指定数据透视表的名称等。关于你的关系。 Laravel的文档提供了以下示例,该示例允许您覆盖默认的数据透视表名称和相应的键:

return $this->belongsToMany('Role', 'user_roles', 'user_id', 'foo_id');

在你的情况下,如果你是一对一的关系,你真的不需要数据透视表。您只需实施hasManybelongsTo关系即可。也就是说,客户属于一个工作,但一个工作可以有很多客户。