【问题标题】:Laravel: how to insert data with foreign keyLaravel:如何使用外键插入数据
【发布时间】:2021-09-06 10:59:08
【问题描述】:

我在使用外键时遇到问题。 我有两张桌子。用户表和用户地址表。我将向您展示迁移过程。

用户表:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('username')->unique()->nullable();
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

这是 user_address 表:

public function up()
    {
        Schema::create('user_address', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->integer('mobile_no')->nullable();
            $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
            $table->string('address')->nullable();
            $table->string('street')->nullable();
            $table->string('city')->nullable();
            $table->string('state')->nullable();
            $table->timestamps();
        });
    }

我不知道在控制器/模型/网络路由中添加或插入什么。 :(请帮帮我。

我有用户模型和 user_address 用户模型:

class User extends Authenticatable
{
    use HasFactory, Notifiable;
    protected $fillable = [
        'name',
        'username',
        'email',
        'password',
        'role_name',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function setUsernameAttribute($value) {
        if ( empty($value) ) {
        $this->attributes['username'] = NULL;
        } else {
            $this->attributes['username'] = $value;
        }
    }

和 user_address 表:

class User_Address extends Model
{
    use HasFactory;

    protected $fillable = [
        'mobile_no',
        'shipping_address',
        'barangay',
        'city',
        'province',
    ];
}

【问题讨论】:

  • 显示你的代码;你有用户模型吗?你有地址的模型吗? user_address 是数据透视表吗(即多个用户可以拥有相同的地址吗?)我们需要更多信息来帮助您。
  • 我有用户和用户地址的模型。但只有受保护的可填充
  • 完美;好多了。所以现在你可能应该在UserUserAddress 之间建立一个关系(注意:类名中不应该有_)。在这种情况下,一个User 可以有许多UserAddress 记录:laravel.com/docs/8.x/eloquent-relationships#one-to-many。然后您需要添加逻辑来创建或更新 UserAddress($user->addresses()->create(...);$user->addresses()->where(...)->first()->update(...)); 等)

标签: php database laravel foreign-keys


【解决方案1】:

也许可以试试这样的:

$user_post=request()->get('name','username','email');
$address_post=request()->get('street','city','address')

$user = new User();
$user -> fill($user_post];
$user->save();


$id=$user->id;

$address_post['user_id']=$id;
$address = new UserAdress();
$address -> fill($user_address);
$address -> save();

我现在不记得应该是 fill() 还是 insert()。

【讨论】:

  • 我应该把这个放在哪里?存储、创建还是更新?
  • 我在考虑控制器,这就是为什么这段代码从 request() 获取数据的原因。用户发送 post 请求(通过表单),并在 route.php 中声明此请求触发控制器,将这些数据放入数据库。
【解决方案2】:

我建议先在 User 模型中创建一个关系

public function address() {
    return $this->hasOne(Addres::class, 'user_id);
}

你可以通过这样做来逃脱

tap(
   User::create(request()->get('name','username','email')), 
   fn($user)=> $user->address()
             ->save(request()->get('street','city','address')
)

或者没有关系,你将不得不做类似的事情

tap(
   User::create(request()->get('name','username','email')), 
   fn($user)=> Address::create[array_merge(
             ['user_id' => $user->id], 
             request()->get('street','city','address')
           )

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2014-08-08
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多