Eloquent BelongsToMany Relationship searches for is null


Eloquent BelongsToMany Relationship searches for is null

我有三个表artistcatalog&cat_artist(数据透视表)。当从我的目录表中检索一行时,我想获得所有与之相关的艺术家。我可以用原始sql来完成这项工作,但由于使用了laravel,所以感觉不对,因为它已经有很多函数可以完成这项任务了。所以我在我的产品模型中有一个函数(产品模式引用目录表)来创建连接

public function artists()
    {
        return $this->belongsToMany('App'Artist', 'cat_artist', 'LOOK_UP_TO_CAT_ID', 'LOOK_UP_TO_ARTIST_ID');
    }

然后我在返回我的视图之前调用它,它给了我目录表中的行

$product = Product::find($id);

现在我想得到所有可能属于这个产品的艺术家,所以我称之为

$artists = $product->artists()->get();

这将返回emtpy结果集

以下是来自上述的查询日志

array(2) { 
    [0]=> array(3) { 
        ["query"]=> string(60) "select * from `catelogue` where `catelogue`.`id` = ? limit 1" 
        ["bindings"]=> array(1) { 
            [0]=> int(96033) 
        } 
        ["time"]=> float(0.91) 
    } 
    [1]=> array(3) { 
        ["query"]=> string(289) "select `artist`.*, `cat_artist`.`LOOK_UP_TO_CAT_ID` as `pivot_LOOK_UP_TO_CAT_ID`, `cat_artist`.`LOOK_UP_TO_ARTIST_ID` as `pivot_LOOK_UP_TO_ARTIST_ID` from `artist` inner join `cat_artist` on `artist`.`id` = `cat_artist`.`LOOK_UP_TO_ARTIST_ID` where `cat_artist`.`LOOK_UP_TO_CAT_ID` is null" 
        ["bindings"]=> array(0) { } 
        ["time"]=> float(0.37) } }

这一切都发生在我返回视图并将数据传递给视图之前

查询中的所有其他内容都是正确的,除了它正在寻找null 的地方

where `cat_artist`.`LOOK_UP_TO_CAT_ID` is null

应该是这个

where `cat_artist`.`LOOK_UP_TO_CAT_ID` = ?

请帮忙。我不知道哪里出错了


编辑

这是我的数据库表-淡化显示所有列将是一个浪费

CREATE TABLE IF NOT EXISTS `artist` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
  `ARTIST` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `ARTIST` (`ARTIST`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8  ;
CREATE TABLE `catelogue` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
  `CAT_NO` varchar(255) DEFAULT NULL,
  `TITLE` varchar(255) DEFAULT NULL,
  `BARCODE` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `BARCODE` (`BARCODE`),
  UNIQUE KEY `CAT_NO` (`CAT_NO`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
CREATE TABLE `cat_artist` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `LOOK_UP_TO_CAT_ID` int(11) NOT NULL,
  `LOOK_UP_TO_ARTIST_ID` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `unique_index` (`LOOK_UP_TO_CAT_ID`,`LOOK_UP_TO_ARTIST_ID`),
  KEY `LOOK_UP_TO_CAT_ID` (`LOOK_UP_TO_CAT_ID`),
  KEY `LOOK_UP_TO_ARTIST_ID` (`LOOK_UP_TO_ARTIST_ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

希望能找到一个答案,解释为什么它把is null放在where语句中,而不是product ID

此外,我还通过用product id替换is null来测试生成的原始SQl,它在phpMyAdmin中确实有效,因此生成的SQl在is null 之前是正确的

这听起来可能很愚蠢,但我认为这是因为字段名是大写字母。因此laravel在Project模型的属性列表中找不到id列。因此它假定您正在搜索空id。因此,至少将ID列重命名为id(小写)。

经过大量挖掘,我发现我使用了错误的var来设置$primaryKey。我用的是$primary_id。我不知道我是如何或在哪里发现的,但这似乎是根本原因,因为我没有更改primaryKey变量,而是声明了一个新的变量-愚蠢的用户错误


对于任何其他找到这个的人,请仔细检查您的代码。

请确保您正在分配正确的变量。

在我的var_dump周围包装一个pre标签有助于读取一个大的obeject/数组,并帮助我找到问题