我有一个看起来像这样的mysql表:
id author public image1 image2 image3 bio media1 media2 media3 media4 media5 media6
The Field"作者" normaly的名字(名字)姓氏由空格分隔。 如何在Lastname之后对数组进行排序,如果在此之后只存在一个名称。
这是我用来对作者进行排序的modx查询,但显然它没有使用姓氏。
$c = $modx->newQuery('AuthorDe');
$c->sortby('author','ASC');
$authors = $modx->getCollection('AuthorDe',$c);
答案 0 :(得分:2)
你现在正在为自己的脚射击,原因有两个:
那说 - 我没有测试过 - 但试试这个:
$c->sortby('substring_index(author," ",-1)','ASC');
答案 1 :(得分:0)
因此,要详细说明非常有价值的观点jous,将多个数据点放在一个数据库列中会产生相反的效果。
你想要做的分类将是简单,快速,和高效,在一个SQL查询中(使用相同的构造jous显示但没有字符串操作)。
要修改此表,您只需将以下列添加到表中以代替作者:
名字
姓氏
中间名
为了向您展示这是多么简单(并使其更容易),这里是代码:
ALTER TABLE [tablename]
ADD COLUMN firstname varchar(32)
ADD COLUMN lastname varchar(32)
ADD COLUMN middlename varchar(32)
DROP COLUMN author;
然后modx PHP代码将是:
$c->sortby('lastname','ASC');
所以这很容易完成......如果你仍然需要支持对作者的其他引用,那么创建一个视图,以与未修改的表所做的相同的方式返回作者,如下所示(注意:你仍然会有更改表名引用,使其指向视图而不是表...如果这将是一个大问题,那么重命名表并命名视图与旧表相同...):
CREATE VIEW oldtablename AS
SELECT firstname+' '+middlename+' '+lastname' ' AS author
FROM newtablename;
注意:如果你确实创建了一个类似上面的视图,那么从新表中添加所有其他列(多个图像和媒体列)可能是值得的。 注意2:但是,我会补充一点,那些理想情况下会出现在这个单独的表格中,但是如果我在你的位置,我可能会认为权宜之计可能超过实用性和优势。未来的可用性......但是如果你把它们放在不同的表中,你可以将这些表添加到这个视图中(作为新表的连接),并且仍然能够支持依赖旧表和现有代码的现有代码。它的结构。
虽然上述内容都相当容易完成,并且可以通过您的微小调整来完成,但最后一部分是让您的自定义表更改由xPDO反映出来。如果您已经对此感到满意并且知道该怎么做那么好。 如果你不是,这是迄今为止关于该主题的最佳文章:http://bobsguides.com/custom-db-tables.html
(是的,值得将Bob的代码作为代码片段,因此一旦数据库发生更改,所有这些都可以简单地为您生成...(请记住,您可能需要删除现有的架构文件& xpdo相关运行Bob的生成代码之前的类文件和映射文件,或者具有相同表名的更改(如视图)将不会生效。
希望这有助于你(或下一个人提出类似的问题)。