我有3个表 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` = ?
请帮忙 . 我无法弄清楚我哪里出错了
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 回答
经过大量的挖掘,我发现我使用了错误的
var
来设置$primaryKey
. 我正在使用$primary_id
. 我怎么或在哪里选择了这个我不改变primaryKey var而是声明一个新的-- Stupid user error对于任何其他人发现这一点 - 仔细检查您的代码 .
确保分配 correct 变量 .
在我的
var_dump
周围包装一个pre
标签有助于读取一个大的obeject /数组并帮助我找到问题这可能听起来很愚蠢,但我认为你的字段名称是大写字母 . 所以laravel无法在Project模型的属性列表中找到id列 . 所以它假设您正在搜索空ID . 所以至少将
ID
列重命名为id
(小写) .