我的Laravel模型有问题,我正在尝试使用我已经在数据库中使用的数据透视表,这是我正在使用的表的布局
客户端
作业
客户端的作业
我相信错误在我的模型中,我并不完全理解雄辩的语法,但我一直在尝试其他几种方法。我想将主要文件保留在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个作业作为虚拟数据)。
先谢谢你提出的任何建议,如果你看到我做过的令人讨厌的事情,请告诉我
答案 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');
在你的情况下,如果你是一对一的关系,你真的不需要数据透视表。您只需实施hasMany
和belongsTo
关系即可。也就是说,客户属于一个工作,但一个工作可以有很多客户。