我目前正在努力解决复杂的 SQL/Laravel 关系问题。
对于每个用户,我需要设置首选项。这些偏好包括四种不同类型:
- 地点
- 竞争对手
- 平台
- 图表
所需的关系类似于:
$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/