Eloquent BelongsToMany关系搜索为null

时间:2016-05-14 13:09:29

标签: php laravel eloquent laravel-5.2

我有3张牌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` = ?

请帮忙。我无法弄清楚我哪里出错了

<小时/> 的修改

这是我的数据库表 - 淡化为显示所有cols将是一种浪费

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

此外,我已通过将is null替换为product id来测试生成的原始SQl,并且它在phpMyAdmin中有效,因此生成的SQL在is null

之前是正确的

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

对任何其他人发现这一点 - 仔细检查您的代码。

确保您分配正确的变量。

pre周围包裹var_dump标记有助于阅读大型对象/数组并帮助我找到问题