laravel 中的 Associate()

Posted

技术标签:

【中文标题】laravel 中的 Associate()【英文标题】:Associate() in laravel 【发布时间】:2018-09-18 09:06:47 【问题描述】:

我有 2 个模型,一个用户和一个地址。自从我在https://laravel.com/docs/5.6/eloquent-relationships#updating-belongs-to-relationships 中读到它之后,我仍在对 associate() 进行试验,但我在实现它时遇到了一些麻烦,遗憾的是我的视频教程没有涵盖 associate() 函数。

class User extends Authenticatable
      public function address() 
      return $this->hasOne('App\Address');


class Address extends Model
      public function user() 
      return $this->belongsTo('App\User');


// --web.php--

Route::get('/sample',function()
$user = User::create(['name'=>'user 1','email'=>'user@laravel.com',password='']);
$address = Address::create(['name'=>'sample address of user 1']);

$address->user()->associate($user);

);

一切都保存了,但我希望地址的 user_id 为 1。相反,地址的 user_id 设置为 NULL。 associate() 不是假设通过自动分配等于父 ID 的外键来将特定的“belongsTo”模型链接到其父模型吗?顺便说一句,我对 PHP 和 Laravel 很陌生,所以是的..

【问题讨论】:

嗨!之后尝试添加$address->save(); Can't get Laravel associate to work的可能重复 【参考方案1】:

你仍然需要save对象来存储值。

正如documentation 所说:

属于关系

当更新一个 belongsTo 关系时,你可以使用 associate 方法。此方法将在子模型上设置外键:

$account = App\Account::find(10);

$user->account()->associate($account);

$user->save();

所以,如你所见,在关联之后:

$address->user()->associate($user);

你需要保存它:

$address->save();

【讨论】:

【参考方案2】:

您的 Address 模型需要有一个 belongsTo User 关系。 例如:

class Address extends Model
    public function user() 
        return $this->belongsTo('App\User');
    

注意:您需要确保有外键约束

例如迁移:

Schema::table('addresses', function (Blueprint $table) 
    $table->unsignedInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
);

【讨论】:

它已经有一个BelongsTo关系,上面已经指出了。我在这里写代码的时候只是有一个拼写错误。对不起 抱歉,我没有看到您在地址模型中的用户关系。 重新编辑了这篇文章中的代码。我在这里写代码时的另一个拼写错误。 @JpArcilla,CUGREen 是对的,Address 模型没有 user() 函数,并且在您的 Web 文件中您正在尝试访问它 您是否在迁移/数据库中设置了外键约束?

以上是关于laravel 中的 Associate()的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.1 关联模型保存的方法(使用associate方法)

laravel中的双向WebSockets?

在 laravel npm 运行开发错误:

计数记录多表的最佳方法 - Laravel

Laravel webwizo 简码包 Shortcodes 类未找到

当图像已上传到文件夹中时,如何解决 laravel 中的“文件不存在或不可读”