当前位置: 首页 > 知识库问答 >
问题:

Laravel选择加入条件

柴瀚昂
2023-03-14

我有3个表格:我的Laravel 5项目的产出、产品和服务。

我想基于此条件在一个查询中连接这3个表:

如果outputs.article_type='p'(p=产品)获取products.name

如果输出。article_type='s'(s=服务)获取服务。名称

$outputs = Output::join('products', 'products.id', '=', 'outputs.article_id')
                   ... only if outputs.article_type is p (p=product)
                ->join('services', 'services.id', '=', 'outputs.article_id') 
                  ... only if outputs.article_type is s (s=service)
                ->select(array('outputs.output_at','---services or product---.name as article_name'))

共有2个答案

司马祖鹤
2023-03-14

检查这个连接使用查询生成器或ELoquent附加条件

但是也许你应该考虑急切加载而不是加入?

Output::with('Product', 'Service')->....

当然你需要先添加关系

public function service() {
   if ($this->article_type == 's')
       return $this->belongsTo('Service', 'article_id', 'id')
   else
       return null;
 }

并重写name属性以获取所需的特定名称

public functon getNameAttribute() {
   if ($this->service)
       return $this->service->name;
   else if ($this->product)
       return $this->product->name;
}
呼延聪
2023-03-14

不确定为什么需要将逻辑放在一个查询中。似乎是一个完美的吻的例子。

为什么不选择一个有1个参数和普通旧的IF的函数来增加可读性,让你(也许还有其他开发者)的生活更轻松?我看不出你想做什么有什么好处。除了简洁之外,在这种情况下,我想这不是最重要的因素。

在输出方面。php模型:

    /**
     * Retrieves output of the given type.
     *
     * @param  string $type Type of the output
     *
     * @return mixed Object or false in case of problems
     */
    public static function getOutput($type) {

        if (!isset($type) || empty($type) || !in_array($type, ['p', 's'])) {
            // Wrong type
            return false;
        }

        if ($type === 'p') {
            $baseQuery = Output::join('products', 'products.id', '=', 'outputs.article_id');
            $table = 'products';
        } else {
            $baseQuery = Output::join('services', 'services.id', '=', 'outputs.article_id');
            $table = 'services';
        }

        return $baseQuery
                   ->select('outputs.output_at', $table.'.name as article_name')
                   ->get();
    }

然后,在控制器中

$output = Output::getOutput('p');

if ($output && count($output)) {
    // Do other stuff or pass the data to a view...
}

请记住,这还没有经过测试,可能需要与我展示的稍微不同的实现,但是这个想法仍然很清楚。

 类似资料:
  • 问题内容: 几个月前,我和其他人一起用PHP编写了一个简单的应用程序。在那里,我们需要根据一个用户ID和您需要从该用户ID选择的行中获取的另一个值,从多个表中执行SELECT。 我的第一个想法是创建多个SELECT并解析PHP脚本中的所有输出(使用所有mysql_num_rows()和类似的函数进行检查),但是那个家伙告诉我他会这样做。“好的没问题!” 我想,我的写作要少得多。好吧,当我发现他只用

  • 常常来说,一个play的结果经常取决于一个变量的值,事件(从远端系统得到事件),或者之前任务的结果.在有些情况下,这些变量的值也会取决于其他变量. 进而,可以建立多余的组基于这些主机是否符合某些条件来操控主机,Ansible 提供了很多不同选项,来控制执行流. 让我们详细看看这些都是啥. When 语句 有时候用户有可能需要某一个主机越过某一个特定的步骤.这个过程就可以简单的像在某一个特定版本的系

  • 问题内容: 我正在尝试将其编译。.我有一个带有firstname和lastname字段的表,并且我有一个字符串,例如“ Bob Jones”或“ Bob Michael Jones”等。 事实是,例如我姓鲍勃,姓迈克尔·琼斯 所以我想 但是它说未知列“ firstlast” ..有人可以帮助吗? 问题答案: 您提供的别名用于查询的输出-它们本身在查询中不可用。 您可以重复表达: 或包装查询

  • 问题内容: 我有3张桌子: 我想显示所有车辆名称的列表。如果,也应返回。 所以我想我将从这里开始: 返回以下内容: 但是,我现在无法将其范围缩小到所需的结果。如果使用,则没有任何变化,因为我已经在JOIN之前选择了不同的汽车ID。加入后它们才是唯一的。如果使用,则删除最后两行,所有对货车的引用都消失了。如果使用,则将第一行和最后一行合并,但是摩托车的则是任意选择的。我想要的是: 我需要一个唯一的汽

  • 我想在SQL中执行以下操作: 在jOOQ中,我将subQ存储到Select中 我的问题是,如何从subQ中获取maxCol列,并在join中使用它?我的连接是这样的: 我在()上出错 类型字段中的方法eq(字符串)不适用于参数(字段) 我该怎么办?