php - 按类型分割的用户偏好

标签 php mysql laravel laravel-5

我目前正在努力解决复杂的 SQL/Laravel 关系问题。

对于每个用户,我需要设置首选项。这些偏好包括四种不同类型:

  1. 地点
  2. 竞争对手
  3. 平台
  4. 图表

所需的关系类似于:

$user = User::find(1)
//Retrieves all user locations
$user->preferences->locations
//Retrieves all user competitors
$user->preferences->competitors
//Retrieves all user platforms
$user->preferences->platforms
//Retrieves all graphs
$user->preferences->graphs

我已经反复更改了当前的数据结构,因为我一直无法弄清楚它,但它看起来像这个表:

  • 用户偏好
    • ID
    • 用户 ID

然后对于每种类型的偏好(位置、竞争对手等),另一个表格:

  • 用户偏好位置
    • user_preferences_id
    • location_id 或竞争对手_id 等

使这种困惑更加复杂的是,四种首选项类型与它们要连接的表不匹配。例如,位置和竞争对手都需要加入到我拥有的业务表(他们在该数据透视表中的 ID 是业务 ID),并且平台需要加入到服务表。

我的问题是,我将如何规划这种复杂的关系?这是我使用多态关系的情况吗?我需要为每个数据透视表(user_preferences_location 等)建立一个模型吗?我现在完全不知所措,几个小时以来我一直在努力思考如何做到这一点。任何帮助都会非常有帮助。

谢谢。

最佳答案

我觉得你想太多了。您真的需要通过 preferences 属性访问关系吗?为什么不直接做这样的事情:

$user = User::find(1)
//Retrieves all user locations
$user->locationPreferences
//Retrieves all user competitors
$user->competitorPreferences
//Retrieves all user platforms
$user->platformPreferences
//Retrieves all graphs
$user->graphPreferences

有什么区别?这些只是用户模型与四种不同类型偏好的模型之间的四种简单的“hasMany”关系。然后你的模型看起来像这样:

class LocationPreference extends Model {
}

// plus classes for the other types of preferences...

class User extends Model {

    public function locationPreferences() {
        return $this->hasMany("LocationPreference");
    }

    // plus methods for the other types of preferences...
}

表格很简单:

CREATE TABLE location_preferences (
    id INT AUTOINCREMENT,
    user_id INT,
    -- plus whatever other fields you need
);

您在开始时描述的方案很好 - 在模型的属性下组织所有首选项在逻辑上非常干净 - 但需要一些扭曲才能使其工作。为什么不采用可能不那么漂亮的简单解决方案?

关于php - 按类型分割的用户偏好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30059740/

相关文章:

php - 将一个图像放在另一个图像上

laravel - Eloquent:检查日期是否在开始日期和停止日期之间

php - 如何在 bootstrap,laravel blade 中为同一行中的元素赋予不同的颜色

javascript - 窗口卸载时更新 mySQL 表

php - 在 PHP 中如何将函数用作 IF 语句的参数?

php - 向线串添加点

mysql - SQL中根据两个同步数组选择数据

mysql - 如果行不存在,则选择默认值;如果第二个表中不存在行,则从多个表中选择

php - Socialite laravel 5.4 Facebook登录报错(RequestException.php line 111中的ClientException)

php - 编写复杂内容过滤器的最有效方法是什么?