与Laravel 5雄辩的CONCAT专栏

Eli*_* KL 12 php mysql laravel-5

把我视为laravel初学者

目标是:我有两个colums,现在我需要在表格中以同一行为id前缀component name.

例如(工作)......我有像Mysql一样

SELECT CONCAT(components.name," ", components.id) AS ID
FROM   `components` 
Run Code Online (Sandbox Code Playgroud)

输出是

ID

|TestComp 40  |
 -------------
|component 41 |
 -------------
|test 42      |
Run Code Online (Sandbox Code Playgroud)

我需要用laravel雄辩的方式,因为这里的Component是Model name.所以我尝试了类似的东西

$comp=Component::select("CONCAT('name','id') AS ID")->get()
Run Code Online (Sandbox Code Playgroud)

但它不起作用.
我认为因为语法错误.
请帮助我正确的语法.用laravel Models.

注意:我做了上面的查询,将其称为互联网上可用的查询.

User::select(DB::raw('CONCAT(last_name, first_name) AS full_name'))
Run Code Online (Sandbox Code Playgroud)

Tsc*_*cka 31

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

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

另外,请注意,因为您正在执行此类查询,您的模型可能会有不同的行为,因为此选择会从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.
Run Code Online (Sandbox Code Playgroud)

  • 它仅显示名称和ID,而不显示实际名称和ID。我确实喜欢这样 $ comp = Component :: select(DB :: raw(“ CONCAT(name,id)AS ID”))-> get()` (2认同)

小智 5

我自己来这篇帖子寻求答案。对我而言,唯一的问题是答案实际上并不能满足我的情况。我有许多表关系设置,并且我需要一个子对象具有一个串联字段。该DB::raw解决方案对我来说太乱了。我不断搜索并找到所需的答案,觉得这是一个更简单的解决方案。

相反DB::raw,我建议尝试一个Eloquent Accessor。访问器允许您检索模型属性并创建原始模型未创建的新属性。

例如,假设我有一个基本的USER_PROFILE表。它包含id, first_name, last_name。我需要CONCAT这两个名称属性,以返回其用户的全名。在我创建的USER_PROFILE模型中php 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}";
  }

}
Run Code Online (Sandbox Code Playgroud)

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

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


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

$user->first_name;   /** John **/
$user->fullname;    /** John Doe **/
Run Code Online (Sandbox Code Playgroud)

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

其他人则说他们可以做到,但是我无法解决这个问题。


bra*_*hex 5

我在 posgresql 和 mysql 上工作:

DB::raw('CONCAT(member.last_name, \' \', member.first_name) as full_name')
Run Code Online (Sandbox Code Playgroud)


Neh*_*oni 5

这是 Laravel 中列串联的示例。

我需要按名称搜索用户,并且用户名有三列(name_first、name_middle、name_last),因此我在 Laravel UserModel 中创建了一个范围,它将$query用户名作为第二个参数。

public function scopeFindUserByName($query,$name) {
    // Concat the name columns and then apply search query on full name
    $query->where(DB::raw(
            // REPLACE will remove the double white space with single (As defined)
            "REPLACE(
                /* CONCAT will concat the columns with defined separator */
                CONCAT(
                    /* COALESCE operator will handle NUll values as defined value. */
                    COALESCE(name_first,''),' ',
                    COALESCE(name_middle,''),' ',
                    COALESCE(name_last,'')
                ),
            '  ',' ')"
        ),
    'like', '%' . $name . '%');
}
Run Code Online (Sandbox Code Playgroud)

您可以在任何需要按用户名搜索用户的地方使用此范围,例如

UserModel::findUserByName("Max Begueny");
Run Code Online (Sandbox Code Playgroud)

或者

$query = UserModel::query();
$query->findUserByName("Max Begueny");
Run Code Online (Sandbox Code Playgroud)

要检查此 SQL 查询的结果,只需从这篇文章中查看即可。 /sf/answers/4360780231/


小智 5

$text = "other";
$limit = 100
public function get_data($text, $limit)
{
    
    $result = $this->select('titulo', 'codigo', DB::Raw("CONCAT(codigo, ' ', titulo_long) AS text_search"))
                ->where('tipo', '=', 2)
                ->having('text_search', 'LIKE', "%$text%")
                ->limit($limit)
                ->get();
    return $result;

}
Run Code Online (Sandbox Code Playgroud)

}