在laravel模型中选择具有模型A列名条件的模型B

jv4diomz  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(118)

我有两个名称和列不同的模型,但这两个模型的用途/数据是相同的,即,它包含雇员的姓名,这里是模型
雇员
| 姓名|代码|乡村|城市|
| - ------|- ------|- ------|- ------|
| 约翰|A1|美国|纽约市|
| 母鹿|A2|美国|洛杉矶|
新增_员工
| v_全名|v_代码|v_国家|城市|
| - ------|- ------|- ------|- ------|
| 马克|ZZ1|美国|最小二乘|
| 楚克|FF2型|美国|最小二乘|
正如您所看到的,列名不同,但用途相同。我想从New_Employee中选择数据,但使用Employee中的列名,因此查询如下所示

SELECT v_fullname as name, v_code as code, v_country as country, v_city as city
FROM New_Employee
WHERE name = 'Mark'

对不起,如果我的解释很难理解,但这里的代码我已经尝试
SyncEmployee模型(这个模型就像是连接employee和new_employee模型的桥梁)

<?php

namespace App\Models;

use App\Models\Employee;
use App\Models\NewEmployee;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class SyncEmployee extends Model
{
    use HasFactory;

    protected $connection = 'mysql_2';

    public const TABLE_NAME = 'new_employee';

    public function index()
    {
        $data = NewEmployee::select('v_fullname as name, v_code as code, v_country as country, v_city as city')->get();
        return view('view_name', compact('data'));
    }

}

我认为使用该代码,当我从控制器调用SyncEmployee::where('code', '=', 'ZZ1')时,结果将
| 姓名|代码|乡村|城市|
| - ------|- ------|- ------|- ------|
| 马克|ZZ1|美国|最小二乘|

  • 数据来自New_Employee,但列名使用Employee
0yycz8jy

0yycz8jy1#

您可以尝试使用在序列化时隐藏或附加属性的功能来为您完成大部分工作。您需要定义访问器和赋值器,并定义序列化的“隐藏”和“附加”内容:

use Illuminate\Database\Eloquent\Casts\Attribute;

class NewEmployee extends Model
{
    ...

    protected $table = 'new_employee';

    protected $hidden = [
        ...
        'v_fullname',
        'v_code',
        'v_country',
        'v_city',
    ];

    protected $appends = [
        ...
        'name',
        'code',
        'country',
        'city',
    ];

    protected function name(): Attribute
    {
        return Attribute::make(
            get: fn () => $this->attributes['v_fullname'] ?? null,
            set: fn ($v) => $this->attributes['v_fullname'] = $v
        );
    }
    
    ...
}

如果在序列化后不使用模型的数据,您仍然可以访问这些字段:

// will hit the accessor
$newEmployee->code;

// will hit the mutator
$newEmployee->code = 'blah';

Laravel 9.x文档-雄辩:变元和强制转换-访问器和变元
Laravel 9.x文档-雄辩:序列化-对JSON隐藏属性
Laravel 9.x文档-雄辩:序列化-向JSON追加值

相关问题