首页 文章

Eloquent BelongsToMany关系搜索为null

提问于
浏览
1

我有3个表 artistcatalogcat_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` = ?

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


EDIT

这是我的数据库表 - 淡化为显示所有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 回答

  • 1

    经过大量的挖掘,我发现我使用了错误的 var 来设置 $primaryKey . 我正在使用 $primary_id . 我怎么或在哪里选择了这个我不改变primaryKey var而是声明一个新的-- Stupid user error


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

    确保分配 correct 变量 .

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

  • 1

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

相关问题