我正在为电子商务应用程序设计我的数据库/域,而我很难弄清楚如何存储产品.
该网站将出售各种产品,钢笔,丁字裤,纹身,雨伞,应有尽有.这些产品中的每一个都会分享一些常见的属性,高度,宽度,长度,重量等,但有些产品有特殊数据.例如,笔具有不同的墨水颜色,并且提示/盖子和小册子可以具有不同类型的折叠.到目前为止,我已经考虑了20多个额外属性,但这些属性可能仅适用于网站上1%的产品.
所以我想知道是否适合实施EAV模型来处理额外的数据.请记住,当客户在前端查看网站时,会有一个过滤侧边栏,如eBay和carsales.com.au.(所以记住会有一些相当多的查询)
我认为实现类表继承是不切实际的,因为系统需要保持灵活性.这是因为,在未来的轨道上,我们可能会在未来使用新类型的产品时拥有更多属性.
我考虑的另一件事是使用NoSQL数据库(可能是MongoDB)但是我对这些类型的数据库没什么经验,它甚至可以解决我的问题吗?
审查选项:
我正在构建一个带有属性实体的原型,以查看它的灵活性,测试性能以及查询失控的方式.
编辑:我当然对任何其他解决方案持开放态度.
php database-design magento entity-attribute-value doctrine-orm
我经常在PHP MVC应用程序中看到一个如下所示的Apache RewriteRule:
RewriteRule ^.*$ - [NC,L]
Run Code Online (Sandbox Code Playgroud)
关于Apache的文档说:
短划线表示不应执行替换(现有路径未经过触摸传递).当需要在不改变路径的情况下应用标志(见下文)时使用.
所以从我收集的内容中,您可以使用它来使用标志来转换路径,即[NC]用于RewriteRules吗?
有人可以解释一下这个破折号RewriteRule好一点吗?
我刚刚在另一台远程服务器上克隆了一个存储库并遇到了一个试图这样做的问题:
git clone git@codebasehq.com:blah/blah/docs.git
Cloning into docs...
remote: Counting objects: 343, done.
remote: error: unable to find 14f87a739828e4d489b0310a51e057b30333926e
remote: Compressing objects: 100% (325/325), done.
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: fatal: unable to read 14f87a739828e4d489b0310a51e057b30333926e
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed
Run Code Online (Sandbox Code Playgroud)
我做了一点研究并发现了git fsck,这是输出:
$ git fsck --full
error: sha1 mismatch 14f87a739828e4d489b0310a51e057b30333926e
error: …Run Code Online (Sandbox Code Playgroud) Zend Framework/Doctrine 2应用程序:
/app
/modules
/blog
/controllers
/BlogController.php
/domain
/entities
/services
/PostService.php
/repositories
Run Code Online (Sandbox Code Playgroud)
PostService负责基本的CRUD操作,直接处理实体和EntityManager,以从我的控制器中抽象出业务和持久性逻辑.
如果可能的话,我想将我的服务作为POPO.在我的服务类中访问/注入EntityManager的最佳方法是什么?我是DI的新手,因此这个问题.EntityManager可作为控制器中的引导资源进行访问.
我应该只为服务编写一个抽象类来访问EntityManager吗?我应该编写一个类来实例化我的服务,通过构造函数/ setter注入EntityManager吗?...这将涉及我的服务的接口.我应该使用DI框架吗?如果是这样,哪一个又如何?
或者还有另一种更好的方法吗?
我已经完成了依赖注入的阅读,但在这种情况下仍然没有完全掌握它.
所以这是我当前的工作解决方案:我有一个名为Resource的动作帮助器,它是从引导程序检索资源的帮助程序,或者您可以手动向其添加资源:http://pastie.org/1450851
$this->_helper->Resource('em'); // get EntityManager
Run Code Online (Sandbox Code Playgroud)
有人可以提供一些深入了解在助手类中本地存储引导资源的性能影响吗?我过度了吗?
TODO:将resourcesMap重构出类.
我有一个用于加载服务的动作助手:http://pastie.org/1450855
TODO:在尝试加载服务之前添加检查.
请对以上内容提出一些批评:)
php model-view-controller dependency-injection zend-framework doctrine-orm
更新:非常肯定这是一个错误,在Jira上发了一个问题:http
: //bit.ly/gpstW9 更新(2011年5月5日):根据jwage的推荐,我已经切换到类别和帖子之间的参考关系(而不是嵌入式).
我正在使用最新版本的Doctrine ODM(Git新增).
我有三个层次的文件(两个嵌入式); 类别 - > EmbedsMany:Post - > EmbedsMany PostVersion.
PostVersion由Post自动处理.当我发布一个新帖子时,它实际上也是一个新的PostVersion.
我的问题是Doctrine与PostVersions混淆,如果我检索现有的Category并添加一个新帖子,新Post的PostVersions会添加到Category的$ posts集合中的第一个Post.
一步步:
在数据库的这个阶段,应该有一个类别,两个帖子,每个帖子都有一个PostVersion.然而,实际发生的是有一个类别,两个帖子,第一个帖子有两个PostVersions,第二个Post有零PostVersions.
请求期间的文档本身是正确的,它只是希望持久化到错误的数据库.我错过了什么?
预期结果:
{
"_id": ObjectId("4da66baa6dd08df1f6000001"),
"name": "The Category",
"posts": [
{
"_id": ObjectId("4da66baa6dd08df1f6000002"),
"activeVersionIndex": 0,
"versions": [
{
"_id": ObjectId("4da66baa6dd08df1f6000003"),
"name": "One Post",
"content": "One Content",
"metaDescription": null,
"isAutosave": false,
"createdAt": "Thu, 14 Apr 2011 13:36:10 +1000",
"createdBy": "Cobby"
}
]
},
{
"_id": ObjectId("4da66baa6dd08df1f6000004"),
"activeVersionIndex": 0
"versions": [
{ …Run Code Online (Sandbox Code Playgroud) 我正在使用RequireJS,我的所有模块都在/payloads/backend/application.
即
/payloads/backend/application/blog/newPost.js
/payloads/backend/application/blog/models/category.js
Run Code Online (Sandbox Code Playgroud)
每当我使用时,require()我必须在配置对象中指定baseUrl:
require({baseUrl: "/payloads/backend/application"}, ["blog/widgets/categories"], function(widget){
// do some stuff with widget
});
Run Code Online (Sandbox Code Playgroud)
我试过把它添加到我的<head>:
<script type="text/javascript">
var require = {
baseUrl: "/payloads/backend/application"
};
</script>
Run Code Online (Sandbox Code Playgroud)
这没有帮助......
我试着暂时将require.js移动到没有帮助的应用程序文件夹中.
如何指定默认的baseUrl?
我正在使用Jison构建一个简单的计算器语言,其中包含变量.我希望这些变量与JavaScript类似,即您必须var首次使用关键字对其进行初始化.在我的语言中,如果变量重新初始化,我想显示错误.
var myVar = 4
var myVar = 3
// Error, cannot reinitialise variable myVar on line 2
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何获取AST节点的行号?在我的语法文件中,我可以将解析器中的行号传递给我的AssignVariable对象,但我想知道是否有更好的方法来执行此操作?
stmt
: 'PRINT' expr
{ $$ = new yy.Print($2) }
| 'VAR' 'IDENTIFIER' 'ASSIGN' expr
{ $$ = new yy.AssignVariable($2, $4, $3); $$.lineNo = yylineno }
| 'IDENTIFIER' 'ASSIGN' expr
{ $$ = new yy.SetVariable($1, $3, $2) }
;
Run Code Online (Sandbox Code Playgroud)
我还需要编译器中其他节点的行号用于其他类型的错误检查.
从这个问题中得到的更高级别的内容可能是:使用Jison(或类似版本)检测和处理编译时错误的最佳方法是什么?
我正在使用Doctrine ODM,并且无法通过引用文档查询嵌入式文档.
考虑以下文件:
<?php
/** @Document */
class TopCategory
{
/** EmbedMany(targetDocument="SubCategory") */
private $subCategories;
}
/** @EmbeddedDocument */
class SubCategory
{
/** ReferenceMany(targetDocument="Product") */
private $products;
}
/** @Document */
class Product
{
/** @String */
private $name;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道我怎么能找到产物TopCategory(或子类别),我已经尝试了几种不同的方式来实现这一目标,一个方法的作品,但有点hackish的.
第一种方式,不起作用:
$category = $dm->createQueryBuilder('TopCategory')
->field('subCategories.products')->includesReferenceTo($someProduct)
->getQuery()->execute();
// ... gives Doctrine\ODM\MongoDB\MongoDBException: No mapping found for field 'subCategories.products' in class 'TopCategory'.'
Run Code Online (Sandbox Code Playgroud)
第二种方式,不起作用:
$category = $dm->createQueryBuilder('SubCategory')
->field('products')->includesReferenceTo($someProduct)
->getQuery()->execute();
// ... returns null
Run Code Online (Sandbox Code Playgroud)
三,工作方法:
$category = $dm->createQueryBuilder('SubCategory')
->field('products.$id')->equals(new \MongoId($someProduct->getId()))
->getQuery()->execute();
// .. works, …Run Code Online (Sandbox Code Playgroud) 编辑:在写完我的问题后,我发现toFront()代码可能会重新创建DOM中不同位置的元素.当它首先删除元素时,它可能会丢失为IE和Opera附加的任何事件,因此我的问题.我将参与委托的活动替代方案,但仍然愿意接受建议.
我在拉斐尔纸上有形状,当你将它们悬停在它们上面时,它们会发光.但是,由于这些形状直接位于彼此的位置,为了确保您能够一直看到发光,我必须将当前的形状带到前面.
这个当前元素位于顶部,因此它的发光将出现在相邻形状的顶部.我的代码在Webkit和Firefox中运行良好,但它在Opera或IE中不起作用.
一旦我添加到前面的代码中,mouseout事件永远不会触发它应该在Opera/IE中.
请参阅我在JS Fiddle上的示例,该示例在Opera/IE中被破坏了.如果您注释掉该toFront()行,它将在所有浏览器中按预期触发mouseout事件.
在那个例子中 - 由于鼠标输出会触发,因此发光仍然存在 - 每个形状会产生多个发光.我可以通过在添加之前检查发光来解决此问题,但这不能解决问题.
编辑2:所以我想出了一个解决方案,使用单个变量存储发光对象,这似乎解决了问题.有趣的是,在包含div的mouseout事件实际上并没有在Opera中调用(没有检查IE).Awww男子,如此接近:(
如果我有一个名为Category的文档,它嵌入了许多SubCategory文档......检索SubCategory的最佳方法是什么(例如基于ID).
使用DocumentRepository时这不起作用.我知道这是MongoDB目前的限制,我已经投票支持虚拟馆藏.
所以我想知道检索SubCategory的最佳方法是什么.我目前的方法如下:
<?php
$category = $dm->createQueryBuilder('Category')
->field('subCategories._id', new \MongoId($id))
->getQuery()->getSingleResult();
foreach($category->getSubCategories() as $sub){
if($sub->getId() === $id){
$subCategory = $sub;
break;
}
}
Run Code Online (Sandbox Code Playgroud) doctrine-orm ×5
php ×5
mongodb ×4
doctrine-odm ×2
javascript ×2
apache ×1
bison ×1
corruption ×1
doctrine ×1
git ×1
jison ×1
magento ×1
mod-rewrite ×1
mongomapper ×1
nosql ×1
raphael ×1
requirejs ×1
svg ×1