我喜欢将Doctrine存储库作为服务传递到Symfony2并避免传递EntityManager的一般想法.然而,虽然在读取数据时很好,但保存逻辑在这里有点问题.
让我们把它作为参考:http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/,但是有一个分开持久和冲洗的变化:
class DoctrineORMCustomerRepository extends EntityRepository implements CustomerRepository
{
public function persist(Customer $customer)
{
$this->_em->persist($customer);
}
public function flush()
{
$this->_em->flush();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是您在特定存储库中刷新所有实体中的所有更改.
现在,是否可以只刷新一类实体?(可能级联到依赖实体),所以我基本上可以这样做:
foreach ($customers as $customer) {
$this->customerRepository->persist($customer);
}
$this->customerRepository->flush();
Run Code Online (Sandbox Code Playgroud)
我考虑过这样的事情:
$this->_em->flush(getUnitOfWork()->getIdentityMap()[$this->_entityName]);
Run Code Online (Sandbox Code Playgroud)
但我必须误解一些东西,因为它不起作用.
编辑:是的,我知道我可以做到$this->_em->flush($entity),但逐一做这件事并不是最理想的.我甚至知道我可以这样做$this->_em->flush($arrayOfEntities),但是为了使"foreach"示例以这种方式工作,我必须跟踪存储库中所有持久化的实体,复制一些Doctrine内部.
有一个类包含一些数据,并在某个时间点对它们进行排序.我使用qsort()并且我想将比较函数保留在类中作为方法.问题是如何传递一个方法,qsort()以便编译器(g ++)不会抛出任何警告?
尝试1:
int Data::compare_records(void * rec_1, void * rec_2){
// [...]
}
void Data::sort(){
qsort(records, count, sizeof(*records), &Data::compare_records);
}
Run Code Online (Sandbox Code Playgroud)
这种方式会产生错误:
error: cannot convert ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’ for argument ‘4’ to ‘void qsort(void*, size_t, size_t, int (*)(const void*, const void*))’
Run Code Online (Sandbox Code Playgroud)
尝试2:
void Data::sort(){
qsort(
records, count, sizeof(*records),
(int (*)(const void*, const void*)) &Data::compare_records
);
}
Run Code Online (Sandbox Code Playgroud)
这种方式会生成警告:
warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, …Run Code Online (Sandbox Code Playgroud) 我正在解析一些具有PHP DOM扩展名的XML,以便以其他形式存储数据。毫不奇怪,当我解析一个元素时,我经常需要获取某个名称的所有子元素。有方法DOMElement::getElementsByTagName($name),但是它返回具有该名称的所有后代,而不仅仅是直接子代。还有一个属性,DOMNode::$childNodes但是(1)它包含节点列表,而不是元素列表,即使我设法将列表项变成元素(2),我仍然需要检查所有这些列表以获取名称。真的没有一种优雅的解决方案来只获得某个特定名称的孩子,还是我在文档中缺少某些东西?
一些插图:
<?php
DOMDocument();
$document->loadXML(<<<EndOfXML
<a>
<b>1</b>
<b>2</b>
<c>
<b>3</b>
<b>4</b>
</c>
</a>
EndOfXML
);
$bs = $document
->getElementsByTagName('a')
->item(0)
->getElementsByTagName('b');
foreach($bs as $b){
echo $b->nodeValue . "\n";
}
// Returns:
// 1
// 2
// 3
// 4
// I'd like to obtain only:
// 1
// 2
?>
Run Code Online (Sandbox Code Playgroud) 我在 GitLab 上有一个小项目,我CHANGELOG.md在其中保存了一个文件。我想在每次合并时更新它以掌握,但有时我会忘记。我正在使用 GitLab CI,因此我想使用它来检查更改日志文件是否已更改。我该怎么做?
我在bash shell中执行带星号的MySQL语句:
query=`cat <<EndOfMySQL
INSERT tmp_table
SELECT * FROM table
;
EndOfMySQL
`
echo $query
echo $query | mysql database
Run Code Online (Sandbox Code Playgroud)
问题是星号被当前目录中的文件列表替换,并且查询变得错误。如何避免这种行为?我使用反引号还是都没关系$()。我希望有一些转义序列,例如\*,但至少这是行不通的。
我的目标是创建一个正确引用描述结构的 XSD 文件的 XML,同时这两个文件都使用命名空间(通过在属性中设置默认命名空间来创建 XML xmlns)。
我可以xsi:noNamespaceSchemaLocation在 XML 中指定属性,并且它至少在某些验证器中有效(例如http://www.validome.org/xml/validate/)。但是当我尝试添加命名空间时,验证器返回错误(例如:找不到元素“note”的声明。)
我准备的测试文件的最终版本附在下面。我用xmllint类似的方法测试了它:
xmllint example.xml --schema example.xsd\nRun Code Online (Sandbox Code Playgroud)\n\n它有效,但我在参数中指定了架构位置。我的问题是:XML 文件是否正确引用了 XSD,是否正确使用了命名空间?为什么验证器返回错误?
\n\n示例.xml:
\n\n<?xml version="1.0" encoding="UTF-8"?>\n<note\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:schemaLocation="example.xsd"\n xmlns="http://example/note"\n>\n <from>Jacek</from>\n <to>Agatka</to>\n <body>Kocham ci\xc4\x99!</body>\n</note>\nRun Code Online (Sandbox Code Playgroud)\n\n示例.xsd:
\n\n<?xml version="1.0" encoding="UTF-8"?>\n<xsd:schema\n xmlns:xsd="http://www.w3.org/2001/XMLSchema"\n xmlns="http://example/note"\n targetNamespace="http://example/note"\n>\n <xsd:element name="note">\n <xsd:complexType>\n <xsd:sequence>\n <xsd:element ref="from"/>\n <xsd:element ref="to"/>\n <xsd:element ref="body"/>\n </xsd:sequence>\n </xsd:complexType>\n </xsd:element>\n\n <xsd:element name="from" type="xsd:string"/>\n\n <xsd:element name="to" type="xsd:string"/>\n\n <xsd:element name="body" type="xsd:string"/>\n\n</xsd:schema>\nRun Code Online (Sandbox Code Playgroud)\n 我需要utf8_general_ci在PHP中复制MySQL 排序规则的行为。严格来说,我需要发现哪些人应该被认为是不同的,哪些将被认为是相同的。大小写无关的部分很容易。问题是utf_general_ci认为带有变音符号的字符和没有变音符号的字符是相等的:e =è=é等。要复制该比较,我需要有一种方法来替换è-> e,é-> e。
我想到的方法是:
echo iconv("utf-8", "ascii//TRANSLIT", "é");
Run Code Online (Sandbox Code Playgroud)
一个问题是iconv行为的变化取决于当前的语言环境,这就是问题所在。
另一个问题是输入中可能还包含不应被剥离或导致PHP通知的Cirillic字母。
echo iconv("utf-8", "ascii//TRANSLIT", "???");
Run Code Online (Sandbox Code Playgroud)
是否有解决方案,或者我必须手动创建每个带有变音符号的字符到没有变音符号的字符的映射?
我正在使用Doctrine 2和ZF2以及Doctrine-Module.我写了一个需要PreUpdate | PrePersist的实体,因为Doctrine不允许在主键中使用Date | Datetime:
<?php
namespace Application\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="sample")
*/
class Sample
{
/**
*
* @ORM\Id
* @ORM\Column(type="string")
* @var integer
*/
protected $runmode;
/**
*
* @ORM\Id
* @ORM\Column(type="date")
* @var DateTime
*/
protected $date;
public function getRunmode()
{
return $this->runmode;
}
public function setRunmode($runmode)
{
$this->runmode = $runmode;
return $this;
}
public function getDate()
{
return $this->date;
}
public function setDate($date)
{
$this->date = $date; …Run Code Online (Sandbox Code Playgroud)