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 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案
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封装

4年前 评论

@Lucky 能否写一段Demo~

4年前 评论

@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年前

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