所以我有两个表,我需要能够得到计数.其中一个包含内容,另一个包含它与类别表之间的关系.这是DDl:
CREATE TABLE content_en (
id int(11) NOT NULL AUTO_INCREMENT,
title varchar(100) DEFAULT NULL,
uid int(11) DEFAULT NULL,
date_added int(11) DEFAULT NULL,
date_modified int(11) DEFAULT NULL,
active tinyint(1) DEFAULT NULL,
comment_count int(6) DEFAULT NULL,
orderby tinyint(4) DEFAULT NULL,
settings text,
permalink varchar(255) DEFAULT NULL,
code varchar(3) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY id (id),
UNIQUE KEY id_2 (id) USING BTREE,
UNIQUE KEY combo (id,active) USING HASH,
KEY code (code) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=127126 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
而对于另一张桌子
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 我有快递和ajax会议的问题.我的应用程序通过Ajax(POST和GET)接收请求并设置会话变量.如果请求不是来自ajax,则会话工作正常,而在相反的情况下,它们只是不起作用.例如 :
if (typeof req.session.id == 'undefined'){
req.session.id = 1;
Run Code Online (Sandbox Code Playgroud)
}
else {
req.session.id++;
}
res.send({session:req.session.id});
Run Code Online (Sandbox Code Playgroud)
现在,当我做localhost:3000 /一切都很好,它每次都递增.如果我从角度通过$ http做同样的事情我继续得到1.我在PHP尝试相同,以防万一角度有问题,但它的工作正常.请注意,ajax调用来自localhost:80
我的快递设置:
app.use(express.bodyParser());
app.use(express.cookieParser('secret'));
app.use(express.cookieSession({secret:'mySecret'}));
app.use(express.session({store:new express.session.MemoryStore(),maxAge : new Date(Date.now() + 3600000)}));
app.use(app.router)
Run Code Online (Sandbox Code Playgroud)
编辑
通过执行console.log(req); 我注意到,当不是来自AJAX我得到:
cookies:
Run Code Online (Sandbox Code Playgroud)
{PHPSESSID:'jm2p2kn7etmofrp48s8sv4pu47',ZDEDebuggerPresent:'php','':'phtml',user_admin:'MTUzOnJvb3Q6U2ptaHJpZmllaG8 =','connect.sess':'s:j:{"id":7} .oIAoC356/z4fQ + + iH44N7YxWZWEP49bTHp1h/gpAElY'}
但是当我从AJAX来的时候我得到{}
我对如何雄辩地制定我无法访问的查询有疑问。当做类似的事情时
$model->where('something')
->distinct()
->paginate();
Run Code Online (Sandbox Code Playgroud)
eloquent 运行查询以获取总数,查询看起来像
select count(*) as aggregate from .....
Run Code Online (Sandbox Code Playgroud)
问题是,如果您在查询中使用 distinct ,您需要类似
select count(distinct id) as aggregate from .....
Run Code Online (Sandbox Code Playgroud)
以获得正确的总数。Eloquent 并没有这样做,因此返回了错误的总数。获得不同计数的唯一方法是通过查询构建器传递一个参数,如 ->count('id') 在这种情况下它将添加它。问题是这个查询是自动生成的,我无法控制它。
有没有办法欺骗它在计数查询上添加不同的?
PS 深入挖掘构建器代码,我们发现一个 IF 语句要求 count() 方法上的一个字段,以便将不同的属性添加到计数中。Illuminate\Database\Query\Grammars\BaseGrammar@compileAggregate
if ($query->distinct && $column !== '*')
{
$column = 'distinct '.$column;
}
return 'select '.$aggregate['function'].'('.$column.') as aggregate';
Run Code Online (Sandbox Code Playgroud)
PS1 我知道在 SQL 中你可以做一个分组,但是由于我急于加载东西,这不是一个好主意,因为它会向其他每个查询添加一个 IN(找到的 id 数量),这会显着减慢速度.
我似乎陷入了经典的ORM问题,并且不知道如何处理它,所以在这一点上欢迎任何帮助.
有没有办法在hasManyThrough查询上获取数据透视表?更好的是,应用一些过滤器或排序.一个典型的例子
表产品
id,title
Run Code Online (Sandbox Code Playgroud)
表类别
id,title
Run Code Online (Sandbox Code Playgroud)
table products_categories
productsId, categoriesId, orderBy, main
Run Code Online (Sandbox Code Playgroud)
因此,在上面的场景中,假设您希望获得(main = true)的所有类别的产品X,或者您希望按类别对产品类别进行排序orderBy.
现在会发生什么是第一SELECT的产品,以获得产品数据,第二SELECT对products_categories获得categoriesId和最终SELECT的类别,以获得实际的类别.理想情况下,过滤器和排序应该适用于第二SELECT类
SELECT `id`,`productsId`,`categoriesId`,`orderBy`,`main` FROM `products_categories` WHERE `productsId` IN (180) WHERE main = 1 ORDER BY `orderBy` DESC
Run Code Online (Sandbox Code Playgroud)
另一个典型的例子是希望根据用户想要的订单来订购产品图像
所以你会有一个products_images表
id,image,productsID,orderBy
Run Code Online (Sandbox Code Playgroud)
你会想要的
SELECT from products_images WHERE productsId In (180) ORDER BY orderBy ASC
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
编辑:这是中间表根据我的架构获得我需要的内容所需的关系.
Products.hasMany(Images,
{
as: "Images",
"foreignKey": "productsId",
"through": ProductsImagesItems,
scope: function (inst, filter) {
return {active: 1};
}
});
Run Code Online (Sandbox Code Playgroud)
事情是范围功能让我访问最终结果而不是中间表.
我有一个像这样的文件:
{
"ExtraFields" : [
{
"value" : "print",
"fieldID" : ObjectId("5535627631efa0843554b0ea")
},
{
"value" : "14",
"fieldID" : ObjectId("5535627631efa0843554b0eb")
},
{
"value" : "POLYE",
"fieldID" : ObjectId("5535627631efa0843554b0ec")
},
{
"value" : "30",
"fieldID" : ObjectId("5535627631efa0843554b0ed")
},
{
"value" : "0",
"fieldID" : ObjectId("5535627631efa0843554b0ee")
},
{
"value" : "0",
"fieldID" : ObjectId("5535627731efa0843554b0ef")
},
{
"value" : "0",
"fieldID" : ObjectId("5535627831efa0843554b0f0")
},
{
"value" : "42",
"fieldID" : ObjectId("5535627831efa0843554b0f1")
},
{
"value" : "30",
"fieldID" : ObjectId("5535627831efa0843554b0f2")
},
{
"value" : …Run Code Online (Sandbox Code Playgroud) 我必须执行以下查询的负载
UPDATE translations SET translation = (SELECT description FROM content WHERE id = 10) WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)
现在,我使用加载数据infile进行插入和替换,但我想要的是esense只更新该表中每行的1个字段,而不会弄乱键.可能是什么语法,请注意查询仅影响现有行.
感谢名单
当你有一个数组字段并将其保存在数据库中时,它会为数组提供一个漂亮的json_encode但没有JSON_UNESCAPED_UNICODE选项.数据最终如下:
{"en":"\u039d\u03ad\u03b1"}
这几乎没用.解决方案当然是json_encode和JSON_UNESCAPED_UNICODE标志.在保存模型之前,是否可以告诉Laravel添加此选项?
我试图避免使用setNameAttribute mutator,因为每次我有这种类型的字段时这样做会很麻烦
我正在尝试做类似PHP的事情array_intersect.我有下表
CREATE TABLE `recipes_ingredients_items` (
`id` INTEGER(11) DEFAULT NULL,
`itemid` INTEGER(11) DEFAULT NULL,
`orderby` TINYINT(4) NOT NULL,
KEY `id` (`id`),
KEY `itemid` (`itemid`)
)ENGINE=MyISAM
AVG_ROW_LENGTH=47 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
Run Code Online (Sandbox Code Playgroud)
我需要一个查询,它会将包含id为2,72,64的所有结果作为一个不同的itemid.问题是id可能在itemid中不止一次存在,即itemid 600可能有3行,其中id为2,100,2.
我的想法是让一个查询说x number o子查询返回结果并执行类似PHP的操作array_intersect,从而返回具有所有这些id的itemid.
SELECT DISTINCT itemid FROM recipes_ingredients_items
WHERE
id IN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 71)
AND
id IN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 2)
AND
id IN (SELECT DISTINCT itemid FROM recipes_ingredients_items WHERE id = 22) …Run Code Online (Sandbox Code Playgroud) mysql ×4
node.js ×2
php ×2
ajax ×1
eloquent ×1
laravel ×1
laravel-4 ×1
laravel-5 ×1
laravel-5.2 ×1
loopbackjs ×1
mongodb ×1
sql ×1
strongloop ×1