在laravel中基于现有列中的值添加新列

snz8szmq  于 2023-03-31  发布在  其他
关注(0)|答案(5)|浏览(139)

我在表中有这些列:

  • 身份证
  • 名称
  • 地位
  • 类型

状态应为01

  • 0表示不活动
  • 1表示不活动。

我想在我的物品列表中添加status_name字段。这可能吗?

$items = Item::where('type', 'test');
if(item.active == 1)
{
   // add new column status_name="active"
}
else
{
   // add new column status_name="inactive"
}

$items->get();

我不想使用循环。有没有什么方法可以不使用循环而只使用这个查询。

fnatzsnv

fnatzsnv1#

如果不允许循环数据,可以使用generated columnsMySQL enumerations
创建迁移将列添加到表中

php artisan make:migration add_status_name_to_items_table --table=items

使用storedgenerated列如下:

$table->enum('status_name', ['inactive', 'active'])->after('status')->storedAs("`status` + 1");

虚拟生成列为:

$table->enum('status_name', ['inactive', 'active'])->after('status')->virtualAs("`status` + 1");

注意枚举值的顺序很重要,可以在SQL语句中使用枚举值的索引而不是那些字符串值

+--------+-------------+----------------------+
| status | status_name | index of status_name |
+--------+-------------+----------------------+
|    -   |     NULL    |         NULL         |
+--------+-------------+----------------------+
|    -   |      ''     |           0          |
+--------+-------------+----------------------+
|    0   |  'inactive' |           1          |
+--------+-------------+----------------------+
|    1   |   'active'  |           2          |
+--------+-------------+----------------------+

您不需要在更新或插入中包含status_name,它将自动设置
希望对大家有所帮助

b91juud3

b91juud32#

您需要循环遍历items集合并应用您的条件,如下所示:

$items = Item::where('type', 'test')->get();
foreach($items as $item){
    $item->status_name = $port->active===1?'active':'inactive';
}
4smxwvx5

4smxwvx53#

在这个例子中,我想把一个名为curbsidePickupVARCHAR字段(包含“true”或“false”(字符串))转换成一个名为pickupTINYINT字段,使其成为原子的。为此,在删除旧字段之前,必须迭代所有项:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;

class ChangeOrdersForBooleanPickup extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('orders', function (Blueprint $table) {
            $table->boolean('pickup');
        });
        DB::table('orders')
            ->where('curbsidePickup', '=', 'true')
            ->update([
                'pickup' => true
            ]);
        Schema::table('orders', function (Blueprint $table) {
            $table->dropColumn('curbsidePickup');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('orders', function (Blueprint $table) {
            $table->string('curbsidePickup');
        });
        DB::table('orders')
            ->where('pickup', '=', true)
            ->update([
                'curbsidePickup' => 'true'
            ]);
        Schema::table('orders', function (Blueprint $table) {
            $table->dropColumn('pickup');
        });
    }
}
bihw5rsg

bihw5rsg4#

要根据列的值将计算列添加到结果中,只需使用数据库的IF()函数即可:

$items = Item::select('*')
    ->selectRaw('IF(status=0,"inactive","active") AS status_name')
    ->where('type', 'test')
    ->get();

另一个选项是更改模型,以便所有示例都包含计算值:

class Item extends Model {
    protected array $appends = ["status_name"];

    public function getStatusNameAttribute(): string
    {
        return $this->status ? "active" : "inactive";
    }
}
amrnrhlw

amrnrhlw5#

使用迁移在表中添加字段

$table->string('status_name');

在控制器中

$items = Item::where('type', 'test')->get();
    foreach($items as $item){
        if($item->status== 1)
        {
          $item['status_name'] = 'active';
        } else {
          $item['status_name'] = 'inactive';
        }
   }

相关问题