我必须使用不是我创建的表,这样它们就不会遵循 Laravel 的规则(没有 icremented 主键,没有逻辑外键和本地键等(。这是我的表格:用户,users_jobs和工作。
users_jobs,我的数据透视表有一个组合键(job_reference 和 job_node(。我知道Laravel不处理复合键,所以我添加了一个新的字段job_key,这只是我在users_jobs和作业中的两个键连接起来。
在我的用户模型中,我有这个:
public function jobs() {
return $this->belongsToMany(''App'Job', 'users_jobs', 'username', 'job_key');
}
它不返回任何结果...
但是当我尝试使用我的一个复合键时,它确实有结果。错误的,因为它只是两个键之一,但它仍然可以工作!
public function jobs() {
return $this->belongsToMany(''App'Job', 'users_jobs', 'username', 'job_reference');
}
任何线索为什么我的新密钥不起作用?
编辑:
当我输出查询时,我有这个:
选择
jobs
.*,users_jobs
。username
pivot_username
,users_jobs
。job_key
pivot_job_key
从jobs
内部连接users_jobs
jobs
。id
=users_jobs
.job_key
users_jobs
的地方.username
(?
当然它什么也找不到,它使用 id 作为外键而不是_job_key_!
而且我不能再用job_reference让它工作了。我知道我的代码有问题,但我看不出是什么,这让我发疯了......
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');
}
}
我在网络上发现了这个特征,它帮助我解决了您在这里遇到的几乎相同的问题。看一看:
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 的任何黑暗功能,但它在我的情况下工作得很好。
希望对您有所帮助!