Laravel 5.3 belongsToMany 无效
Laravel 5.3 belongsToMany won't work
我必须使用我没有创建的 table,所以它们不遵循 Laravel 的规则(没有增量主键,没有逻辑外键和本地键等。 ).这是我的 tables:users、users_jobs 和 jobs。
我的枢轴 table、users_jobs 有一个复合键(job_reference 和 job_node)。我知道 Laravel 不处理复合键所以我添加了一个新字段 job_key,这只是我的两个键连接,在 users_jobs 和职位。
在我的用户模型中我有这个:
public function jobs() {
return $this->belongsToMany('\App\Job', 'users_jobs', 'username', 'job_key');
}
它returns没有结果...
但是当我尝试使用我的复合键之一时,它确实有结果。错误的,因为它只是两个键之一,但仍然有效!
public function jobs() {
return $this->belongsToMany('\App\Job', 'users_jobs', 'username', 'job_reference');
}
知道为什么我的新密钥不起作用吗?
编辑:
当我输出查询时,我有这个:
select jobs
.*, users_jobs
.username
as pivot_username
, users_jobs
.job_key
as pivot_job_key
from jobs
inner join users_jobs
on jobs
.id
= users_jobs
.job_key
where users_jobs
.username
in (?)
当然它没有找到任何东西,它使用 id 作为外键而不是 _job_key_ !
而且我无法让它与 job_reference 一起工作了。我知道我的代码有问题,但我看不到什么,这让我发疯...
我在网上找到了这个特性,它帮助我解决了与您在这里遇到的几乎相同的问题。看一看:
trait HasCompositePrimaryKey {
/**
* Get the value indicating whether the IDs are incrementing.
*
* @return bool
*/
public function getIncrementing() {
return false;
}
/**
* Set the keys for a save update query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function setKeysForSaveQuery(Builder $query) {
foreach ($this->getKeyName() as $key) {
if ($this->$key)
$query->where($key, '=', $this->$key);
else
throw new Exception(__METHOD__ . 'Missing part of the primary key: ' . $key);
}
return $query;
}
}
在您的模型中使用它,例如:
use Traits\HasCompositePrimaryKey;
protected $primaryKey = ["license_id", "trailer_id"];
重新定义了使用id字段的方法,让它接受一个数组。
我并没有真正检查这是否会破坏 eloquent 的任何暗功能,但它在我的情况下工作得很好。
希望对您有所帮助!
class User extends Model{
protected $primaryKey = 'username';
public function jobs() {
return $this->belongsToMany('App\Job', 'users_jobs', 'username', 'username');
}
}
class Jobs extends Model{
protected $primaryKey = 'job_key';
public function users() {
return $this->belongsToMany('App\User', 'users_jobs', 'job_key', 'job_key');
}
}
我必须使用我没有创建的 table,所以它们不遵循 Laravel 的规则(没有增量主键,没有逻辑外键和本地键等。 ).这是我的 tables:users、users_jobs 和 jobs。
我的枢轴 table、users_jobs 有一个复合键(job_reference 和 job_node)。我知道 Laravel 不处理复合键所以我添加了一个新字段 job_key,这只是我的两个键连接,在 users_jobs 和职位。
在我的用户模型中我有这个:
public function jobs() {
return $this->belongsToMany('\App\Job', 'users_jobs', 'username', 'job_key');
}
它returns没有结果...
但是当我尝试使用我的复合键之一时,它确实有结果。错误的,因为它只是两个键之一,但仍然有效!
public function jobs() {
return $this->belongsToMany('\App\Job', 'users_jobs', 'username', 'job_reference');
}
知道为什么我的新密钥不起作用吗?
编辑:
当我输出查询时,我有这个:
select
jobs
.*,users_jobs
.username
aspivot_username
,users_jobs
.job_key
aspivot_job_key
fromjobs
inner joinusers_jobs
onjobs
.id
=users_jobs
.job_key
whereusers_jobs
.username
in (?)
当然它没有找到任何东西,它使用 id 作为外键而不是 _job_key_ !
而且我无法让它与 job_reference 一起工作了。我知道我的代码有问题,但我看不到什么,这让我发疯...
我在网上找到了这个特性,它帮助我解决了与您在这里遇到的几乎相同的问题。看一看:
trait HasCompositePrimaryKey {
/**
* Get the value indicating whether the IDs are incrementing.
*
* @return bool
*/
public function getIncrementing() {
return false;
}
/**
* Set the keys for a save update query.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
protected function setKeysForSaveQuery(Builder $query) {
foreach ($this->getKeyName() as $key) {
if ($this->$key)
$query->where($key, '=', $this->$key);
else
throw new Exception(__METHOD__ . 'Missing part of the primary key: ' . $key);
}
return $query;
}
}
在您的模型中使用它,例如:
use Traits\HasCompositePrimaryKey;
protected $primaryKey = ["license_id", "trailer_id"];
重新定义了使用id字段的方法,让它接受一个数组。
我并没有真正检查这是否会破坏 eloquent 的任何暗功能,但它在我的情况下工作得很好。
希望对您有所帮助!
class User extends Model{
protected $primaryKey = 'username';
public function jobs() {
return $this->belongsToMany('App\Job', 'users_jobs', 'username', 'username');
}
}
class Jobs extends Model{
protected $primaryKey = 'job_key';
public function users() {
return $this->belongsToMany('App\User', 'users_jobs', 'job_key', 'job_key');
}
}