我有3个模型使用单表继承.它们适用于可在我们网站上购买的三种不同类型的商品.这些项目被分类,因此Category模型具有用于映射这三种类型中的每一种的属性.
当使用简单的选择来获取所有类别,然后在类别中显示它们的名称和每种类型的项目的数量时,Doctrine总共执行369个查询,总共549毫秒.(一个用于类别列表,然后一个用于类别中的每个类型.)
所以我开始在查询中添加联接以消除所有额外的查询.它适用于第一个项目类型,主查询运行在101.80毫秒.(根据Symfony Profiler工具栏)
$this->_em->createQueryBuilder()
->select([$alias, 'courses'])
->from($this->_entityName, $alias)
->leftJoin("{$alias}.courses", 'courses');
Run Code Online (Sandbox Code Playgroud)
只要我添加第二个连接,查询就会减慢到24050.14毫秒
$qb = $this->_em->createQueryBuilder()
->select([$alias, 'courses', 'bundles'])
->from($this->_entityName, $alias)
->leftJoin("{$alias}.courses", 'courses')
->leftJoin("{$alias}.bundles", 'bundles');
Run Code Online (Sandbox Code Playgroud)
我还没有尝试过第三次加入,担心它会让服务器崩溃.
真正奇怪的是,如果我使用Doctrine查询记录并获得确切的查询,并在我的数据库上手动运行它,它只运行0.2秒.
该表在所有FK列和鉴别器列上都有索引.
任何建议将不胜感激.谢谢!
编辑:4/3
我必须让分支回到其他问题的工作点才能回到这个问题.
SQL小提琴与架构(减去其他未在这种情况下加载的表的FK):http://sqlfiddle.com/#!28/85051
所以,我有没有连接的页面,并且它在820.38毫秒内进行了382次查询以进行延迟加载.当我手动加入,而不是依赖延迟加载,它以130为21159(这是唯一加盟模式2,所以它仍然懒加载第三)
$qb = $this->_em->createQueryBuilder()
->select([$alias, 'courses', 'bundles'])
->from($this->_entityName, $alias)
->leftJoin("{$alias}.courses", 'courses')
->leftJoin("{$alias}.bundles", 'bundles');
Run Code Online (Sandbox Code Playgroud)
这是来自Symfony工具栏的查询(20241.26 ms)
SELECT
i0_.description AS description0,
i0_.id AS id1,
i0_.name AS name2,
i0_.created_at AS created_at3,
i0_.updated_at AS updated_at4,
i0_.display_order AS display_order5,
i1_.atccode AS atccode6,
i1_.version AS version7,
i1_.description AS description8,
i1_.online_price AS online_price9, …
Run Code Online (Sandbox Code Playgroud) 我有一个Admin类,它有listFields的这个定义:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('type')
->add('created_at', 'datetime')
->add('updated_at', 'datetime')
->add('created_by')
->add('updated_by')
->add('is_active')
->add('is_deleted')
->add('_action', 'actions',
array(
'actions' => array(
'view' => array(),
'edit' => array(),
'delete' => array()
)
))
;
}
Run Code Online (Sandbox Code Playgroud)
只有"类型"列是可排序的 - IE,当您将鼠标悬停在"类型"的表头上时,您会看到一个asc/desc箭头,并且可以单击以根据此列重新排序行.
如何让它显示在更多列上?
我尝试添加sortable = true但是它正在尝试加入另一个实体.
我使用命令行界面在config.yml中启用了Translator服务,清除了缓存并安装了资产.
我的登录页面仍然显示"security.login.submit".我正在使用自定义模板,该模板位于:app/Resources/FOSUserBundle/views/Security/login.html.twig
并包含(从FOS提供的模板复制):
{{ 'security.login.submit'|trans }}
Run Code Online (Sandbox Code Playgroud)
我的config.yml:
framework:
translator: { fallback: "%locale%" }
default_locale: "%locale%"
Run Code Online (Sandbox Code Playgroud)
parameters.yml:
parameters:
locale: en
Run Code Online (Sandbox Code Playgroud) $username = preg_replace("/[^\p{L}|\p{N}]/u", "", html_entity_decode($username));
Run Code Online (Sandbox Code Playgroud)
这允许"字母"和"数字" $username
,删除其他一切.
但是我怎样才能在混合中使用 "."
点符号呢?也会"-"
很好.
非常感谢你!
我正在使用Behat,我正在尝试选择一些表单元素.
我的HTML如下 - 基本上我有两个必填字段,一个是输入,一个是textarea,还有一个复选框.
<table class="table">
<thead>
<tr>
<th>Delete</th>
<th>Question</th>
<th>Reference</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox" name="delete" /></td>
<td><textarea name="question" required="required"></textarea></td>
<td><input type="text" required="required" name="reference" /></td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
获取表单元素的xpath选择器是:
//table/tbody/tr/td/input
Run Code Online (Sandbox Code Playgroud)
这显然适用于输入 - 但是当我添加textarea并尝试检查它时,它找不到textarea,因为,它不是输入.
我试过这个://table/tbody/tr/td/(input or textarea)
和使用"或",|等的几种变体我无法弄清楚如何指定多种类型的元素来尝试匹配.
提前致谢!:)
我有一个像这样的 JSON 字符串:
[{"Format":"I25","Content":"172284201241"}, {"Format":"I25","Content":"40124139"},
{"Format":"I25","Content":"20197086185689"},
{"Format":"I25","Content":"10215887"},
{"Format":"I25","Content":"702666712272"},
{"Format":"QRCODE","Content":"3"}]
Run Code Online (Sandbox Code Playgroud)
我只想随机选择其中一项,例如:
{"Format":"I25","Content":"40124139"}
Run Code Online (Sandbox Code Playgroud)
我怎样才能用 PHP 做到这一点?
php ×6
symfony ×3
arrays ×1
behat ×1
doctrine-orm ×1
forms ×1
html ×1
json ×1
mysql ×1
preg-match ×1
preg-replace ×1
regex ×1
sonata-admin ×1
sorting ×1
xpath ×1