CONCAT专栏与Laravel 5雄辩

2022-08-30 14:45:27

把我当成新手

目标是:我有两个 colum,现在我需要在表中以同一行为前缀。idcomponent name

例如(工作)...我有Mysql喜欢

SELECT CONCAT(components.name," ", components.id) AS ID
FROM   `components` 

输出是

编号

|TestComp 40  |
 -------------
|component 41 |
 -------------
|test 42      |

我需要以雄辩的方式使用相同的组件,因为这里的组件是模型名称。所以我尝试了类似的东西

$comp=Component::select("CONCAT('name','id') AS ID")->get()

但它不起作用。
我想是因为语法错误。
请帮助我使用正确的语法。用。laravelModels

注意:我做了上面的查询,并把它称为互联网上可用的查询。

User::select(DB::raw('CONCAT(last_name, first_name) AS full_name'))

答案 1

您需要将查询包装在:DB::raw

$comp = Component::select(DB::raw("CONCAT('name','id') AS ID"))->get()

另请注意,由于您正在执行此类查询,因此模型的行为可能会有所不同,因为此选择会从 select 语句中删除所有其他字段。因此,如果没有新查询,就无法从模型中读取其他字段。因此,仅将其用于读取数据,而不用于修改数据。

另外,为了使它成为一个不错的列表,我建议您将查询修改为:

$comp = Component::select(DB::raw("CONCAT('name','id') AS display_name"),'id')->get()->pluck('display_name','id');
// dump output to see how it looks.
dd($comp);// array key should be the arrray index, the value the concatted value.

答案 2

我自己来到这篇文章寻求答案。对我来说,唯一的问题是,答案并不适合我的情况。我设置了许多表关系,我需要其中一个子对象具有串联字段。解决方案对我来说太乱了。我一直在寻找并找到了我需要的答案,并觉得这是一个更容易的解决方案。DB::raw

而不是,我建议尝试一个雄辩的访问器。访问器允许您检索模型属性并创建不是由原始模型创建的新属性。DB::raw

例如,假设我有一个基本的USER_PROFILE表。它包含 .我需要CONCAT两个名称属性来返回其用户的全名。在我创建的USER_PROFILE模型中,我会放置以下内容:id, first_name, last_namephp artisan make:model UserProfile

class UserProfile extends Model
{

  /**
   * Get the user's full concatenated name.
   * -- Must postfix the word 'Attribute' to the function name
   *
   * @return string
   */

  public function getFullnameAttribute()
  {
      return "{$this->first_name} {$this->last_name}";
  }

}

从这里开始,当我进行任何雄辩的调用时,我现在可以访问该附加属性访问器。

| id | first_name | last_name |
-------------------------------
| 1  | John       | Doe       |


$user = App\UserProfile::first(); 

$user->first_name;   /** John **/
$user->fullname;    /** John Doe **/

我会说我确实遇到了一个问题。这是尝试创建具有相同名称的已修改属性,如您的示例(id,ID)所示。我可以修改id值本身,但由于我声明了相同的名称,它似乎只允许访问该字段值,而不允许访问其他字段。

其他人说他们能做到,但我无法解决这个问题。


推荐