【问题标题】:Eloquent - Select one column with the same name from two different modelEloquent - 从两个不同的模型中选择一个具有相同名称的列
【发布时间】:2018-09-21 04:13:33
【问题描述】:

我有 Student Model 和 User Model,它们有一列同名 (token)。情况是当我从用户页面或学生页面发布token 时,我想使用单个控制器处理该请求。我试过的,

Class DataController
{
    public function deleteData($request, $response)
    {
        $token = $request->getParam('token');

        $user = User::where('token', $token)->first();
        $student = Student::where('token', $token)->first();

        if ($user) {
            $user->delete();
            // flash message user's data deleted
            // redirect to home
        }

        if ($student) {
            $student->delete();
            // flash message student's data deleted
            // redirect to home
        }

        // flash message error
        // redirect to home
    }
}

有没有办法从两个模型中选择一列?根据 SOLID 原则,我的代码是否错误?如何清理我的代码?我仍在学习重构方法以提高灵活性,但不知道该怎么做

【问题讨论】:

    标签: php eloquent slim


    【解决方案1】:

    您不需要条件,只需要两个查询。

    User::where(compact('token'))->delete();
    Student::where(compact('token'))->delete();
    

    你为什么要这样做,我不确定。如果 Student 与 User 相关,则应使用外键保持这种关系。

    无关提示:

    • 考虑使用$request->input('token') 而不是getParam()。后者只查看查询字符串,除非有原因,否则坚持使用input() 是从查询字符串或请求正文中提取请求数据的安全方法。
    • 确保在将$token 应用于数据库查询之前对其进行验证。在执行删除之前至少检查它不是空的。
    • 了解授权。意识到这可能是您的控制器的简化表示,因为任何人都可以通过传递有效令牌来删除任何用户。

    【讨论】:

    • Student 和User 之间没有关系。你能告诉我紧凑在那个查询中的作用吗?如果(出于某种原因)令牌未提供或与两种型号都不匹配(只是预防措施),它不是错误吗?
    • 如果令牌不匹配任何记录,则不会删除任何内容。如果对数据库运行delete from users where token = 'non-existent-token',则不会出现错误。 Laravel 也不会抱怨。
    • compact('token') 等价于[ 'token' => $token ]。我发现它更容易阅读,尤其是当条件建立时,即。 compact('token', 'username', 'email') 与 [ 'token' => $token, 'username' => $username, 'email' => $email]
    • 如果两个模型之间没有关系,你应该考虑有两个独立的控制器。 UserController 和 StudentController,每个都有自己的 destroy() 方法,可以从各自的模型中删除。
    • 我分别有UserController 和StudentController。 DataController 仅用于删除或注册 User 和 Student 的数据。
    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2018-10-20
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多