Php Laravel 5.3 belongtomany不起作用

Php Laravel 5.3 belongtomany不起作用,php,eloquent,foreign-key-relationship,laravel-5.3,Php,Eloquent,Foreign Key Relationship,Laravel 5.3,我必须处理我没有创建的表,这样它们就不会遵循Laravel的规则—没有ICR修订的主键,没有逻辑外键和本地键,等等。。以下是我的表格:用户、用户、作业和作业 我的数据透视表users\u jobs有一个复合键job\u引用和job\u节点。我知道Laravel不处理复合键,所以我在users\u jobs和jobs中添加了一个新的字段job\u key,它只是我的两个键连接在一起 在我的用户模型中,我有: public function jobs() { return $this->

我必须处理我没有创建的表,这样它们就不会遵循Laravel的规则—没有ICR修订的主键,没有逻辑外键和本地键,等等。。以下是我的表格:用户、用户、作业和作业

我的数据透视表users\u jobs有一个复合键job\u引用和job\u节点。我知道Laravel不处理复合键,所以我在users\u jobs和jobs中添加了一个新的字段job\u key,它只是我的两个键连接在一起

在我的用户模型中,我有:

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');
}
知道我的新钥匙为什么坏了吗

编辑:

当我输出查询时,我有:

public function jobs() {
    return $this->belongsToMany('\App\Job', 'users_jobs', 'username', 'job_key');
}
选择jobs.*,users\u jobs.username作为pivot\u username,users\u jobs.job\u key作为pivot\u job\u key from jobs internal jobs jobs jobs.id=users\u jobs.job\u key其中users\u jobs.username在

当然,它找不到任何东西,它使用id作为外键,而不是“作业”\u键


我再也不能用工作证明让它工作了。我知道我的代码中有错误,但我看不出是什么,这让我发疯……

我在网络上发现了这种特性,它帮助我解决了几乎与您在这里遇到的问题相同的问题。看一看:

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字段并让它接受数组的方法

我并没有真正检查这是否打破了雄辩的任何黑暗功能,但它在我的情况下工作得很好


希望有帮助

我在网上发现了这一特点,它帮助我解决了与你在这里遇到的几乎相同的问题。看一看:

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;
    }
}
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');
    }
}
在您的模型中使用它,如:

use Traits\HasCompositePrimaryKey;

protected $primaryKey = ["license_id", "trailer_id"];
这将重新定义使用id字段并让它接受数组的方法

我并没有真正检查这是否打破了雄辩的任何黑暗功能,但它在我的情况下工作得很好


希望有帮助

您可以发布表格的列吗?用户:id、用户名、姓氏、姓氏、电子邮件、生日等。用户作业:id、用户名、作业密钥、作业引用、作业节点、开始日期、结束日期、注释、默认值、操作作业:id、作业密钥、作业引用、作业节点、父节点、节点名称、活动、,用户中的用户名和作业中的作业密钥是否为主键?为了确定要检索的记录,我删除了列id,并将usersame和job_key设置为主键。现在我有一个错误SQLSTATE[42S22]:找不到列:1054未知列'jobs.id'在'on'子句'SQL:select。。。我从不在我的代码中调用id…如果在users\u jobs中,你也有一个job\u key列与用户的jobs和username相关,那么我的anwser应该可以工作。你可以发布表中的列吗?用户:id、username、lastname、firstname、email、birthdate等。用户\u jobs:id、username、job\u key、job\u reference、job\u node、startdate、enddate、comment、default、,操作作业:id、作业密钥、作业引用、作业节点、父节点、节点名称、活动等。用户中的用户名和作业中的作业密钥是主键吗?为了确定要检索的记录,我删除了列id,并将usersame和job_key设置为主键。现在我有一个错误SQLSTATE[42S22]:找不到列:1054未知列'jobs.id'在'on'子句'SQL:select。。。我从不在我的代码中调用id…如果在users\u jobs中,您也有job\u key列与jobs和users相关,我的anwser应该可以工作。我的查询现在是正确的!仍然没有结果,但我找到了原因。用户名是0000000009,在这个过程中它变成了9…当我在模型中将username设置为primearykey时,它改变了它:尝试使用受保护的$casts=['username'=>'string'];另外,您确定db中的列是同一类型的吗?我的查询现在是正确的!仍然没有结果,但我找到了原因。用户名是0000000009,在这个过程中它变成了9…当我在模型中将username设置为primearykey时,它改变了它:尝试使用受保护的$casts=['username'=>'string'];另外,你确定db中的列是同一类型的吗?太好了!只要我能让我的代码正常工作,我就会试试这个;哦,太好了!只要我能让我的代码正常工作,我就会试试这个;
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');
    }
}