【问题标题】:How to check for two way unique record in Laravel?如何在 Laravel 中检查双向唯一记录?
【发布时间】:2019-04-22 19:34:35
【问题描述】:

我不确定这将如何工作,但我经常遇到这个问题。如果只有一个主键,我可以使用它,但有 2 个需要是唯一的。

每次创建新记录之前我都必须检查,是否没有 Laravel 魔法可以用来检查幕后是否已经存在类似的东西?

我不确定 Laravel 是否提供双向主键,我真的不知道要在他们的文档中寻找什么,但想知道是否可以提供帮助?

if (CourseEntry::where('course_id', $course->id)->where('user_id', Auth::user()->id)->count() < 1) {
    CourseEntry::create([
        'course_id' => $course->id,
        'user_id' => Auth::user()->id,
        'last_interaction' => Carbon::now(),
        'started_at' => Carbon::now()
    ]);
}

我的User.php 中有一段关系可能会有所帮助?

public function courseEntries() {
    return $this->hasMany('App\Models\CourseEntry');
}

【问题讨论】:

  • 你知道任何 SQL 吗? Laravel 并不是为了消除对 SQL 和数据模型的担忧。是的,您可以在迁移中定义一个唯一键。在插入之前检查是否存在是一种反模式,而不是为了确保唯一性。
  • 我了解 MySQL 支持唯一键,但它是否支持多个唯一键?我知道这是一个 SQL 问题,但它使用 Laravel 迁移蓝图系统,没有使用 SQL。
  • 主键可以只有一个,可以用1列或多列来标识。可以有 多个唯一 键,由 1 列或更多列定义。 Laravel 迁移并不神奇,它与底层数据库引擎相关联,这使其成为与 SQL 相关的问题。您可以在迁移中定义这些键。

标签: php laravel


【解决方案1】:

取决于你想对结果做什么,我可以根据你想要更新用户与特定课程的最后一次交互的列来猜测,你可以这样实现:

$courseEntry = CourseEntry::firstOrNew([ 
        'course_id' => $course->id,
        'user_id' => Auth::user()->id 
    ],
    [
        'started_at' => Carbon::now() // this should be set just the first time, when the user entry does not exists
    ]);

$courseEntry->last_interaction = Carbon::now(); // this should be updated each time.
$courseEntry->save();

【讨论】:

  • 这肯定更短而且有点简化,但我会等待另一个答案,因为我觉得有更好的方法更简化。
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多