Laravel 如何实现 relationship 多字段关联?

通常两个model关联 我们用 hasOne 或者hasMany即可
但是 如果Model关联约束超出一个字段该如何解决?
Stack Overflow的帖子有相关解决方案: https://stackoverflow.com/questions/297518...
但是我试过会报错。

举例说明:
存在两个Model: Product和ProductStats,二者通过sku字段一对一关联;但实际上二者还有一个字段shop_id,用以表示所在的销售平台,必须俩字段同时约束,获取到的才是正确的数据。

class ProductStats {
public function product ()
    {
        return $this->hasOne('\App\Model\Product', 'sku', 'sku')->where('shop_id', $this->shop_id);
    }
}

按照上述声明,会出现下列情况:

// 得到的product是null
ProductStats::with('product')->get();

// product可以获取到正确的数据
$res = ProductStats::query()->get();
foreach ($res as &$unit) {
    $unit->product;
}

// product 可以获取到正确的数据
ProductStats::with([
    'product' => function ($query)use (&$shopId) {
        $query->where('shop_id', $shopId);
    }
])->get();

显然,第一种方式最为便捷,但需要在Model中对product做正确的封装。
诸位有解决方法不?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
3年前 评论
Vicoo 3年前
KaneYoung (楼主) 3年前
qiuwang 3年前
qiuwang 3年前
playmaker 2年前
讨论数量: 10
ALMAS
$this->hasOne('\App\Model\Product', 'sku', 'sku')->where('shop_id', $this->shop_id)

改成

$this->hasOne('\App\Model\Product', 'sku', 'sku')->whereRaw('product_table.shop_id=pruduct_stats_table.shop_id')

试试。因为with是方法里获取不到$this->shop_id的。

5年前 评论

file

按照你的代码试了一下,不sing耶~

5年前 评论
ALMAS

@KaneYoung with中不会用到join,所以不能这么用,我给忘了。

5年前 评论

用scope封装

5年前 评论

@Lucky 能否写一段Demo~

5年前 评论

@KaneYoung 请问您针对这种情况的解决办法是什么 现在目前我也碰到了同样的问题

4年前 评论

@wumengke

我目前的解决方法有2个

[方法一]
让Model-A在关联Model-B的时候,先预设另一个需要关联的字段,在关联方法中再通过where查询传递该关联字段。

举例
A::ec(1); //设置了关联字段ecId的值,目前我的处理方法是将该值存储于A类的static属性中
再通过下图的方式在关联查询中加入该属性

file

[方法二]
增加视图表 在视图中预先将数据关联好 之后就不必定义Relationship了
不过 这种视图不能存储 只能查询哈~ 存储要另外处理

4年前 评论
playmaker 2年前

&$shopId哪来的

4年前 评论
KaneYoung (楼主) 4年前

我也想知道怎么操作,有结果了吗?

3年前 评论
KaneYoung (楼主) 3年前
3年前 评论
Vicoo 3年前
KaneYoung (楼主) 3年前
qiuwang 3年前
qiuwang 3年前
playmaker 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!