Laravel 4 关系数据库查询

Posted

技术标签:

【中文标题】Laravel 4 关系数据库查询【英文标题】:Laravel 4 relational database query 【发布时间】:2014-02-06 20:23:32 【问题描述】:

谁能帮我解决以下问题。

我有一个包含邮政编码列和评级列的表格,即。

ID |  POSTCODE | RATING 
 1 |   sk101dd |   E
 2 |   sk101de |   A
 3 |   sk101df |   E
 4 |   sk101dg |   E
 5 |   sk101dh |   D    
 etc

这被设置为一个名为 PostcodeList 的模型

我有一个关系表,通过包含客户 ID 和成本的 RATING 列链接,即。

ID | CUSTOMER_ID | RATING | COST
 1 |    1234     |    E   | 0.05
 2 |    9999     |    E   | 0.02

这被设置为一个名为 RatingCost 的模型。我使用以下代码将其链接到 PostcodeList 模型:

public function costing()

    return $this->hasMany('PostcodeList','RATING','RATING');

我需要使用 CUSTOMER_ID 作为过滤器从 RatingCost 模型中返回 COST,而不使用多个 sql 语句。我想我已经差不多了,使用下面的代码,但它不太正确:

$p = PostcodeList::where('postcode',$somepostcode)->first();

$cost = $p->costing()->where('customer_id',$somecustomerid)->first()->cost;

我目前遇到的错误是“尝试获取非对象的属性”。

非常感谢任何帮助。我不想求助于 DBRAW 或其他形式的连接,因为我真的很喜欢 Laravel 提供的关系设置。

谢谢

【问题讨论】:

您似乎收到了错误,因为邮政编码没有 customer_id 列。您还应该将其标记为 php 感谢您的回复。 postcode 表不存储任何客户 id,只有 RatingCost 表保存这一点,因为将有多个不同的客户 id 链接到相同的评级但具有不同的成本。所以我可能向 Laravel 错误地解释了这一点,但无法找出正确的代码 这更有意义。那么为什么要迭代邮政编码列表以匹配客户 ID?我不熟悉 DBRAW,但 laravel 确实在这里实现了自己的连接:laravel.com/docs/queries#joins 我需要搜索 PostcodeList 以找到输入的邮政编码 ($somepostcode)。实际上我可以简化,因为我不需要使用 get(),只需使用 first()。现在将修改那一点。 【参考方案1】:

我知道你试图远离连接,但是这个 Laravel 查询会产生想要的结果:

  DB::table('PostcodeList')
            ->join('RatingCost', function($join)
            
                $join->on('RATING', '=', 'RatingCost.RATING')
                     ->->where('customer_id',$somecustomerid)
            )

【讨论】:

谢谢,是的,那是我的后备计划,如果我想不通,我会选择的。但如果可能的话,我很乐意让 hasMany 有点工作。 是否有可能是本地键和外键都被命名为'RATING'? 实际代码没有使用我在这里使用的相同键名,为了清楚起见我进行了修改。但感谢您的回复。【参考方案2】:

你有这个

$postcode_get = PostcodeList::where('postcode',$somepostcode)->get();
foreach($postcode_get as $p)
   ...
   $cost = $p->costing()->where('customer_id',$somecustomerid)
   // ...

您在RatingCost 模型中定义了方法costing,但从PostcodeList 模型中调用它,在这种情况下,您需要在PostcodeList 模型中声明关系,如下所示:

public function costing()

    // change the field name 'RATING' in any table, maybe
    // prefix with table name or something else, keep different
    return $this->belongsToMany('RatingCost','RATING', 'RATING');

所以,你可以使用这个(内部循环):

$cost = $p->costing();

因为,在您的loop 中,每个$p 代表一个PostcodeList 模型,而$postcode_getPostcodeList 模型的集合。

【讨论】:

感谢您的回复。我最初完全按照您在那里所说的那样使用“belongsTo”。但是,根据 customer_id 可能有多种成本,即,在邮政编码“sk101dd”中具有 id 1234 类型的客户返回等级 E,成本为 0.05,但是在邮政编码“sk101dd”中具有 id 9999 类型的客户返回等级 E,成本为 0.02 .我是否认为这将需要“hasMany”而不是“belongsTo”? 如果我明白你的意思,应该是 belongsToMany 而不是 belongsTo 谢谢,但似乎没有解决问题。我还在尝试一些事情,当我到达某个地方时会更新帖子【参考方案3】:

我认为如果不使用连接,我实际上是不可能做到的。所以解决方案是废弃标准连接的 belongsTo 和 hasMany 选项(类似于 dev_feed 的响应):

$pr = PostcodeList::join('RatingCost', function($join)
      
         $join->on('PostcodeList.content_rate', '=', 'RatingCost.code');
      )
      ->where('postcode', '=', $somepostcode)
      ->where('RatingCost.customer_id','=',$somecustomerid)
      ->first();

【讨论】:

很高兴你知道了,伙计。请接受您的回答,这样当其他人查看问题时,他们会在顶部看到您的回答 是的,如何设置为已回答?找不到其他选项 请参阅this link 了解更多信息

以上是关于Laravel 4 关系数据库查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 4 中查询数据透视表

基于关系数据的查询 |拉拉维尔 5.4

在 Laravel 4 中如何查询多对多关系?

Laravel 模型关联建立与查询

如何在 Laravel 中查询具有精确指定关系的数据集?

Laravel:如何编写关于 belongsToMany 关系的连接计数查询?