2016-05-14 48 views
1

我有3个表artist, catalog & cat_artist(数据透视表)。当从我的目录表中检索一行时,我想获取所有关联的艺术家。我可以用raw 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在哪里,而不是product ID

此外,我已经测试了结果通过用product id更换is null婷原始的SQL和它的工作在phpMyAdmin这样生成的SQL是正确的高达is null

回答

1

经过大量的挖掘,我发现我使用了错误的var来设置$primaryKey。我正在使用$primary_id。如何或我就捡起,我不知道,但它似乎是根本原因,因为我没有改变PrimaryKey的变种,而是宣告一个新的 - 愚蠢的用户错误


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

确保您正在分配正确的变量。

缠绕我var_dump有助于阅读大量obeject /阵列pre标签,帮我找到了问题

1

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

+0

我是有缺陷的。我创建了一个测试数据库,将列更改为小写字母,并且工作正常!这很有用,但它现在提出了一个更大的问题,因为我不能只是把所有的col改成小写。有没有办法告诉laravel /雄辩不要将列名更改为小写,并使用名称格式? PS-这看起来像一个非常愚蠢的错误,因为我正在阐明将模式中的主键设置为'ID' – Mark

+0

您不必将所有列更改为小写。改变'id'栏就够了。如果你真的需要使用你的新数据库,请尝试为模型使用增变器。 –

+0

我以为mututors是正确的,但我错了。突变体改变了价值,而不是关键。经过更多的挖掘,我找到了正确的答案 – Mark