侧边栏壁纸
  • 累计撰写 168 篇文章
  • 累计创建 71 个标签
  • 累计收到 35 条评论

目 录CONTENT

文章目录

Laravel一对一关系

神兵小将
2023-02-10 / 0 评论 / 21 点赞 / 781 阅读 / 6,158 字 / 正在检测是否收录...

创建迁移
我们需要两个迁移文件。一个用于“用户”表,另一个用于“电话”表。默认情况下,当我们安装laravel时,我们会获得用户表的迁移。

迁移文件是在数据库内创建表架构的文件。

我们将在 /database/migrations 文件夹中找到用户的迁移2014_10_12_000000_create_users_table.php。

打开迁移文件,我们应该在其中看到以下代码。

xxx_users_table.php

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
};

在终端中打开项目并运行此迁移命令以创建电话迁移表。

$ php artisan make:migration CreatePhonesTable

它将根据时间戳值在 /database/migrations 处创建一个2022_03_31_170942_create_phones_table.php的文件。

打开文件并将整个代码写入其中。

xxx_create_phones_table.php

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('phones', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users');
            $table->string('phone');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('phones');
    }
};

运行迁移
接下来,我们需要在数据库中创建表。

$ php artisan migrate

此命令将在数据库内创建表。

创建模型
我们需要在应用程序内部创建一些模型。默认情况下,User.php 在应用程序设置中可用。

打开 User.php 并使用此代码进行更新。

```php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use App\Models\Phone;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * Get the phone associated with the user.
     * 
     * Syntax: return $this->hasOne(Phone::class, 'foreign_key', 'local_key');
     *
     * Example: return $this->hasOne(Phone::class, 'user_id', 'id');        
     */
    public function phone()
    {
        return $this->hasOne(Phone::class);
    }
}

hasOne() 方法用于获取用户的关联电话号码。这是一对一的关系,其中每个用户都与特定的手机号码相关联。

接下来,我们将为电话表创建模型。

运行此命令以创建模型 –

$ php artisan make:model Phone

它将在 /app/Models 文件夹中创建 Phone.php 文件。打开文件并编写此代码。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;

class Phone extends Model
{
    use HasFactory;

    public $timestamps = false;

    protected $fillable = [
        'user_id',
        'phone'
    ];

    /**
     * Get the user that owns the phone.
     * 
     * Syntax: return $this->belongsTo(Phone::class, 'foreign_key', 'owner_key');
     *
     * Example: return $this->belongsTo(Phone::class, 'user_id', 'id');        
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

belongsTo() 方法正在 laravel 中实现一对一关系的反比关系。

创建具有一对一关系的播种机
返回终端并键入这些工匠命令。

用户播种机表:

$ php artisan make:factory UserFactory --model=User

电话播种机表:

$ php artisan make:factory PhoneFactory --model=Phone

它将在 /database/factories 文件夹中创建两个文件,UserFactory.php 和 PhoneFactory.php。

打开 UserFactory.php 文件并将此代码写入其中。

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => bcrypt("123456"), // password
            'remember_token' => Str::random(10),
        ];
    }

    /**
     * Indicate that the model's email address should be unverified.
     *
     * @return static
     */
    public function unverified()
    {
        return $this->state(function (array $attributes) {
            return [
                'email_verified_at' => null,
            ];
        });
    }
}

打开PhoneFactory.php文件并编写此代码。

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Phone>
 */
class PhoneFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            "user_id" => \App\Models\User::factory()->create()->id,
            "phone" => $this->faker->phoneNumber
        ];
    }
}

下一个

我们需要使用修补匠的概念,通过一对一的雄辩关系来生成虚假数据。

打开端子和类型

$ php artisan tinker

在修补外壳面板中,运行此命令以将虚拟数据播种到数据库表中。

>>> App\Models\Phone::factory()->count(10)->create()

此命令将在用户和电话表中设定数据种子。在这两个表中,我们将有 10 条记录。

上面的命令仅用于为电话表生成工厂数据,但在PhoneFactory中,我们也有为用户表生成工厂数据的代码。

"user_id" => \App\Models\User::factory()->create()->id,

控制器使用情况
打开任何控制器,例如 DataController.php 来自 /app/Http/Controllers 文件夹中的文件。

在这里,我们创建了两个使用模型方法作为属性的方法。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Phone;

class DataController extends Controller
{
    public function getPhone($user_id)
    {
        // Passing user id into find()
        return User::find($user_id)->phone;
    }

    public function getUser($phone_id)
    {
        // Passing phone id into find()
        return Phone::find($phone_id)->user;
    }
}

用户::查找(userid>电话;它将按用户ID查找电话详细信息值。一对一电话::查找(user_id)->电话; 它将按用户 ID 查找电话详细信息值。 一对一 电话::查找(phone_id)->用户;它将通过电话ID查找用户详细信息。 一对一/所属的反转
创建路由
从 /routes 文件夹中打开 web.php 并将这些路由添加到其中。

use App\Http\Controllers\DataController;

Route::get('get-phone/{id}', [DataController::class, 'getPhone']);
Route::get('get-user/{id}', [DataController::class, 'getUser']);

//...

应用测试
将项目打开到终端并键入命令以启动开发服务器

$ php artisan serve

网址

Get Phone details: http://127.0.0.1:8000/get-phone/1
Get User details: http://127.0.0.1:8000/get-user/1
21

评论区