Laravel 5.3 属于许多不起作用


Laravel 5.3 belongsToMany won't work

我必须使用不是我创建的表,这样它们就不会遵循 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_jobsusername pivot_usernameusers_jobsjob_key pivot_job_keyjobs内部连接users_jobs jobsid = 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 的任何黑暗功能,但它在我的情况下工作得很好。

希望对您有所帮助!