如何将这个Laravel PHP代码简化为一个雄辩的查询?

2022-08-30 21:13:14

我假设这应该全部在一个查询中,以防止数据库中的重复数据。这是正确的吗?

如何将此代码简化为一个 Eloquent 查询?

$user = User::where( 'id', '=', $otherID )->first();

if( $user != null )
{
    if( $user->requestReceived() )
        accept_friend( $otherID );
    else if( !$user->requestSent() )
    {
        $friend = new Friend;
        $friend->user_1= $myID;
        $friend->user_2 = $otherID;
        $friend->accepted = 0;
        $friend->save();
    }
}

答案 1

我假设这应该全部在一个查询中,以防止数据库中的重复数据。这是正确的吗?

这是不正确的。通过在数据库级别放置约束来防止重复。unique

实际上,在php或任何其他语言中,如果您没有唯一的键,那么您将无法做到这一点,这可以防止重复。这是一个简单的事实,如果有人告诉你任何不同的事情 - 那个人是公然错误的。我可以解释为什么,但解释会很长,所以我会跳过它。

您的代码应该非常简单 - 只需插入数据即可。由于目前还不清楚如何处理唯一性(它似乎是 ,但有一个边缘情况),如果没有更多的数据,就不可能提出一个完整的解决方案。user_2, accepted

你总是可以忽略我写的东西,并尝试使用建议的解决方案,但它们会失败得很惨,你最终会得到重复。


答案 2

我会说,如果两者之间有关系,你可以简单地使用Laravel的模型关系,例如:UserFriend

$status = User::find($id)->friends()->updateOrCreate(['user_id' => $id], $attributes_to_update));

这就是我要做的,以确保更新新数据或创建新数据。

PS:我只在Laravel 5.2.*上使用了updateOrCreate()。而且在更新之前对用户存在进行一些检查也会很好,否则可能会为null引发一些错误。

更新

我不知道该怎么办。您能再解释一下我应该做什么吗?$attributes_to_update呢?

好。根据好友表中的哪些字段标记两个好友,现在使用您的示例和 .根据我给出的例子,这将是(假设是新朋友的id):user_1user_2$attributes_to_updateotherID

$attributes_to_update = ['user_2' => otherID, 'accepted' => 0 ];

如果 和 之间的关系设置正确,则 将 已包含在插入中。UserFrienduser_1

此外,在此更新或创建函数上:

updateOrCreate($attributes_to_check, $attributes_to_update);

$attributes_to_check这意味着在创建/更新新字段之前,您要检查它们是否已经存在,因此,如果我想确保,请检查是在何时进行的,那么我可以通过两个说“['user_1'=>1,'接受'=>0]accepted0

希望现在这一点更清楚。


推荐