我有三个表artist
、catalog
&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/数组,并帮助我找到问题