Laravel 5.3 belongsToMany 无效

Laravel 5.3 belongsToMany won't work

我必须使用我没有创建的 table,所以它们不遵循 Laravel 的规则(没有增量主键,没有逻辑外键和本地键等。 ).这是我的 tables:usersusers_jobsjobs

我的枢轴 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');
    }
}