当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将这个LaravelPHP代码简化为一个Eloquent查询?》经验,为你挑选了3个好方法。

我假设这应该都在一个查询中,以防止数据库中的重复数据.它是否正确?

如何将此代码简化为一个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();
    }
}

Mjh.. 10

我假设这应该都在一个查询中,以防止数据库中的重复数据.它是否正确?

这不对.您可以通过unique在数据库级别上设置约束来防止重复.

有字面上没有什么可以用PHP或任何其他语言为此事做,这将防止重复,如果你没有在你的表(一个或多个)唯一的密钥.这是一个简单的事实,如果有人告诉你任何不同的事情 - 那个人是公然错误的.我可以解释原因,但解释会很冗长,所以我会跳过它.

您的代码应该非常简单 - 只需插入数据即可.因为它不是确切清楚如何独特的处理(这似乎是user_2, accepted,但有一个边缘的情况下),没有一点更多的数据形成你-这是不可能提出一个完整的解决方案.

你可以随时忽略我写的内容,并尝试使用建议的解决方案,但它们会失败,你最终会重复.



1> Mjh..:

我假设这应该都在一个查询中,以防止数据库中的重复数据.它是否正确?

这不对.您可以通过unique在数据库级别上设置约束来防止重复.

有字面上没有什么可以用PHP或任何其他语言为此事做,这将防止重复,如果你没有在你的表(一个或多个)唯一的密钥.这是一个简单的事实,如果有人告诉你任何不同的事情 - 那个人是公然错误的.我可以解释原因,但解释会很冗长,所以我会跳过它.

您的代码应该非常简单 - 只需插入数据即可.因为它不是确切清楚如何独特的处理(这似乎是user_2, accepted,但有一个边缘的情况下),没有一点更多的数据形成你-这是不可能提出一个完整的解决方案.

你可以随时忽略我写的内容,并尝试使用建议的解决方案,但它们会失败,你最终会重复.



2> Oluwatobi Sa..:

我想说如果之间存在关系User,Friend你可以简单地使用Laravel的模型关系,例如:

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

多数民众赞成我将采取哪些措施来确保更新新数据或创建新数据.

PS:我在Laravel 5.2.*上使用了updateOrCreate().而且在更新之前实际检查用户存在会很好,否则可能会抛出一些错误.

UPDATE

我不知道该怎么做.你能解释一下我应该做些什么吗?$ attributes_to_update怎么样?

好的.取决于friends表中的哪些字段标记这两个朋友,现在使用您的示例user_1user_2.通过我给出的例子,$attributes_to_update将是(假设otherID是新朋友的id):

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

如果你User和之间的关系Friend设置得当,那么user_1插入中就已经包含了.

此外,在此updateOrCreate函数上:

updateOrCreate($attributes_to_check, $attributes_to_update);

$attributes_to_check在你创建/更新新字段之前,你想要检查那些字段是否已经存在,所以如果我想确保,那么检查是在什么时候accepted进行的,0然后我可以通过它们说'['user_1'=> 1,'接受' => 0]

希望现在更清楚了.



3> alepeino..:

我假设"朋友"在这里表示用户之间的多对多关系.显然是朋友请求从一个用户(myID)到另一个用户(otherId).

你可以用Eloquent表示:

class User extends Model
{
    //...

    public function friends()
    {
        return $this->belongsToMany(User::class, 'friends', 'myId', 'otherId')->withPivot('accepted');
    }
}

也就是说,不需要Friend模型.

然后,我认为这相当于你想要完成的事情(如果没有,请更新澄清):

$me = User::find($myId);

$me->friends()->syncWithoutDetaching([$otherId => ['accepted' => 0]]);

(accepted0或1,根据您的业务逻辑).

sync方法可防止重复插入,并为给定的"myId - otherId"对更新或创建任何行.您可以使用此方法在数据透视表中设置任意数量的其他字段.

但是,我同意@Mjh关于在数据库级别设置唯一约束.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有