我有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` = ?
请帮忙。我无法弄清楚我哪里出错了
<小时/> 的修改
这是我的数据库表 - 淡化为显示所有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
答案 0 :(得分:1)
这可能听起来很愚蠢,但我认为你的字段名称是大写字母。所以laravel在Project模型的属性列表中找不到id列。所以它假设您正在搜索空ID。
因此,至少将ID
列重命名为id
(小写)。
答案 1 :(得分:1)
经过大量挖掘,我发现我使用了错误的var
来设置$primaryKey
。我正在使用$primary_id
。我如何或在哪里选择了这个我不知道,但它似乎是根本原因,因为我没有更改primaryKey var而是声明一个新的 - 愚蠢的用户错误
对任何其他人发现这一点 - 仔细检查您的代码。
确保您分配正确的变量。
在pre
周围包裹var_dump
标记有助于阅读大型对象/数组并帮助我找到问题