- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
赏金:
+500 代表奖励给一个好的解决方案。我已经用头撞墙两周了,准备好寻求帮助了。
表格/模型(简化以显示关联)
总体思路:
用户可以创建节点类型(例如“电视台”、“电视节目”和“ Actor ”......任何内容)。如果我提前知道节点类型是什么以及每个节点之间的关联,我只需为它们制作模型 - 但我希望这是非常开放的,以便用户可以创建他们想要的任何节点类型。然后,每个节点(特定节点类型的)可以与任何其他节点类型的任何其他节点相关。
描述和我的尝试:
每个节点都应该能够与任何/每个其他节点相关。
我的假设是,要做到这一点,我必须有一个关联表 - 所以我制作了一个名为“node_associations”的表,其中包含 node_id
和 other_node_id
。
然后我建立了我的关联(通过我相信使用 hasMany ):(以下是我对设置的最佳记忆......可能略有偏差)
//Node model
public $hasMany = array(
'Node' => array(
'className' => 'NodeAssociation',
'foreignKey' => 'node_id'
),
'OtherNode' => array(
'className' => 'NodeAssociation',
'foreignKey' => 'other_node_id'
)
);
//NodeAssociation model
public $belongsTo = array(
'Node' => array(
'className' => 'Node',
'foreignKey' => 'node_id'
),
'OtherNode' => array(
'className' => 'Node',
'foreignKey' => 'other_node_id'
)
);
起初,我以为我明白了 - 这是有道理的。但后来我开始尝试检索数据,并且在过去的两周里一直在用头撞墙。
示例问题:
假设我有以下节点:
如何设置我的数据结构,以便能够提取所有电视台,并包含他们的电视节目,其中包含他们的 Actor (作为示例)?这对于正常的模型设置来说很简单:
$this->TvStation->find('all', array(
'contain' => array(
'TvShow' => array(
'Actor'
)
)
));
然后,也许我想检索所有男性 Actor 并包含包含电视台的电视节目。或者晚上 9 点开始的电视节目,包含 Actor 和电台...等等。
但是 - 使用 HABTM 或 HasMany 通过 self(更重要的是,未知的数据集),我不知道模型是哪个字段(node_id 或 other_node_id),总的来说,我无法理解我的想法就可以得到内容了。
最佳答案
让我们尝试用约定来解决这个问题,node_id 将是别名按字母顺序排在第一位的模型,而 other_node_id 将是第二位的别名。
对于每个包含的模型,我们动态创建一个与 Node 类的 HABTM 关联,为每个关联创建一个别名(请参阅 bindNodes
和 bindNode
方法)。
我们查询的每个表都会在 node_type_id
上添加一个额外条件,以仅返回该类型节点的结果。 NodeType 的 id 通过 getNodeTypeId()
选择,并且应该被缓存。
要在深度相关的关联中使用条件过滤结果,您需要手动添加额外的联接,为每个具有唯一别名的可连接创建联接,然后使用别名联接每个节点类型本身,以便能够应用条件(例如,选择具有 Actor x 的所有 TvChannel。在 Node 类中为此创建一个辅助方法。
在我的演示中,我将 foreignKey
用于 node_id
,将 associationForeignKey
用于 other_node_id
。
<?php
/**
* @property Model NodeType
*/
class Node extends AppModel {
public $useTable = 'nodes';
public $belongsTo = [
'NodeType',
];
public function findNodes($type = 'first', $query = []) {
$node = ClassRegistry::init(['class' => 'Node', 'alias' => $query['node']]);
return $node->find($type, $query);
}
// TODO: cache this
public function nodeTypeId($name = null) {
if ($name === null) {
$name = $this->alias;
}
return $this->NodeType->field('id', ['name' => $name]);
}
public function find($type = 'first', $query = []) {
$query = array_merge_recursive($query, ['conditions' => ["{$this->alias}.node_type_id" => $this->nodeTypeId()]]);
if (!empty($query['contain'])) {
$query['contain'] = $this->bindNodes($query['contain']);
}
return parent::find($type, $query);
}
// could be done better
public function bindNodes($contain) {
$parsed = [];
foreach($contain as $assoc => $deeperAssoc) {
if (is_numeric($assoc)) {
$assoc = $deeperAssoc;
$deeperAssoc = [];
}
if (in_array($assoc, ['conditions', 'order', 'offset', 'limit', 'fields'])) {
continue;
}
$parsed[$assoc] = array_merge_recursive($deeperAssoc, [
'conditions' => [
"{$assoc}.node_type_id" => $this->nodeTypeId($assoc),
],
]);
$this->bindNode($assoc);
if (!empty($deeperAssoc)) {
$parsed[$assoc] = array_merge($parsed[$assoc], $this->{$assoc}->bindNodes($deeperAssoc));
foreach($parsed[$assoc] as $k => $v) {
if (is_numeric($k)) {
unset($parsed[$assoc][$k]);
}
}
}
}
return $parsed;
}
public function bindNode($alias) {
$models = [$this->alias, $alias];
sort($models);
$this->bindModel(array(
'hasAndBelongsToMany' => array(
$alias => array(
'className' => 'Node',
'foreignKey' => ($models[0] === $this->alias) ? 'foreignKey' : 'associationForeignKey',
'associationForeignKey' => ($models[0] === $alias) ? 'foreignKey' : 'associationForeignKey',
'joinTable' => 'node_associations',
)
)
), false);
}
}
$results = $this->Node->findNodes('all', [
'node' => 'TvStation', // the top-level node to fetch
'contain' => [ // all child associated nodes to fetch
'TvShow' => [
'Actor',
]
],
]);
关于cakephp - 自 "HABTM"或 "HasMany Through"概念混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224596/
是否可以在一个集合/json 中获取所有详细信息(用户、帖子、postimages)? 用户->hasmany(帖子) 后->hasmany(后图像) 用户: 身份证 |姓名 邮政: 身份证 |用户
我正在制作一个具有基本消息传递功能的 PHP/MySQL Web 应用程序。两个用户将能够进行包含一系列消息的“对话”。 以下是我设想的模型关系: 用户> 多对多> 对话 对话> 多对多> 用户和一对
我的问题很简单: 我有一个名为users 的表。这些用户可以有很多联系人。这些联系人是其他用户。 所以我有一个名为 userHasContacts 的表,其中包含所有者的 ID (userID) 和联
我有两个 GORM 域类。一个是卡,卡上有很多购买。有什么方法可以搜索大于或等于某些购买的卡。这可能是一个例子 我们有4张牌: Card1:橙、橙、苹果 Card2:苹果、橙子 Card3:橙色,橙色
背景: 我有三个表,即生产、生产线和操作。 生产线引用其先前的生产线,列名为“parent_id”。生产线的深度应等于操作的深度。 以下是他们的关系: Production_lines has man
我有两个表(项目、任务)。 项目表结构如下: id - title - desc - others_column 1 - title - desc - others 2 - title - des
提前感谢您的帮助。 我有两个模型菜单和窗口及其关联 db.menus.hasMany(db.windows); db.windows.belongsTo(db.windows); 我正在尝试使用与此类
使用hasMany有区别吗 static hasMany = [objects:Object] 并添加对象的集合 Set objects 最佳答案 使用之间绝对有区别: static hasMany
我有这四个类: class Animal { static hasMany = [legs: Leg] } class Cat extends Animal { static hasM
当我尝试创建与其父模型关联的子模型时遇到问题。 我有 2 个模型: 机构(有很多地址) 地址(有 1 个机构) 当我单击一个机构并转到 show.blade.php 时,我有一个表单可以为该机构创建地
我正在运行 cakephp 2.0.2,我有以下关系 Category hasMany CategoryWork Work hasMany CategoryWork Categ
是否有一个简单的解决方案可以通过模型上的 hasMany Relation 分离(不删除)所有相关模型? 例如,我有两个表: 学院(ID、名称) 学生(id、姓名、college_id(可为空)) 在
Ember Data 是否类似于 Rails 的 has_many ..., :through =>功能? 最佳答案 它不是。在 1.0 Beta 中添加了一个 Unresolved 问题。里程碑:M
我有用户表,然后是他们的兴趣表。 最好是通过表来管理 hasMany 来管理两者之间的关系,还是最好将 CSV 写入“用户”表中的一列。 到目前为止,我一直在通过表格使用 hasMany,但想知道最好
假设我有两个模型:Park 和 Items。通过 HasMany 关系,每个 Park 都可以有多个 Items。 在 Items 表中有一个 park_id 字段和一个 type 标志:一个 Ite
这是save和 saveMany HasMany 上的方法关系类,但 dissociate(Many) 在哪里?/detach(Many)方法?也没有获得逆关系方法的内置方法,那么从 HasMany
我试图让我在 CakePHP 2.3 中的关联模型正确保存,但我遇到了问题。我正在存储帖子,我想知道这些帖子中有哪些链接。对于这些链接中的每一个,如果可用,我想存储 anchor 文本。我的数据库设置
我有两个类(例如简化): public class Data { public int Id {get; set;} public string Value { get; set; }
有域对象: class Book { List pictures static hasMany = [pictures:Picture] static mappi
我正在尝试实现 HasMany与不可为空的键列的映射。 我的映射如下所示: public void Override(AutoMapping mapping) { mapping.Table(
我是一名优秀的程序员,十分优秀!