我正在尝试在 ZF2 应用程序中为 Doctrine2 创建实体。 我的实体应该有 id varchar(15),但是当我尝试创建新行时,doctrine2 没有将这个 ID 推送到数据库中。
在实体生成类中我有这个:
/**
* Checkpoints
*
* @ORM\Table(name="checkpoints", uniqueConstraints{@ORM\UniqueConstraint(name="sort", columns={"sort"})}, indexes={@ORM\Index(name="country", columns={"country"})})
* @ORM\Entity
*/
class Checkpoints
{
/**
* @var string
*
* @ORM\Column(name="id", type="string", length=15, nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
// rest of the entity...
是否需要更改某些内容才能将此 ID 从表单传递到 doctrine flush 中的数据库?
最佳答案
Doctrine 为每个数据库处理不同的@ORM\GeneratedValue(strategy="Identity")。在 MySql 的情况下,它将插入一个生成的值,也称为 AUTO_INCREMENT,导致 integer 作为 ID。请看http://docs.doctrine-project.org/en/2.0.x/reference/basic-mapping.html#identifiers-primary-keys .
在您的情况下,您不应该使用 GeneratedValue 注释,包括它的策略。所以彻底删除它。如果您想要表单的 ID,您可以在您的实体中设置一个构造函数,该构造函数将为该实体设置您的 ID。
class Checkpoints {
public function __constructor($id)
{
$this->id = $id;
}
/**
* @var string
*
* @ORM\Column(name="id", type="string", length=15, nullable=false)
* @ORM\Id
*/
private $id;
// rest of the entity...
}
请注意,不提及 GeneratedValue 注释与 GenerateValue(strategy="None") 相同。
当然您可以稍后在创建它之后设置您的 ID,但是此实体的每个实例都需要一个 ID,因此最好由您的构造函数强制它设置它。
所以在你的 Controller 中你可能会使用这样的东西
if ($form->isValid() {
$formData = $form->getData();
$checkpoint = new Checkpoints($formData['id']);
}
正如您提到的,您希望通过输入表单来设置 ID。但是让我指出,用户可以输入重复的主键。为了捕捉它,你必须检查一个对象是否已经存在,在这种情况下我建议使用 \DoctrineModule\Validator\NoObjectExists。参见 https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md关于 Doctrine 验证器。
因此,为了检查是否存在具有该 ID 的对象,您可以将此验证器添加到表单的输入过滤器中:
public function getInputFilterSpecification()
{
$entityManager = $this->serviceManager->get('Doctrine\ORM\EntityManager');
return array(
'id' => array(
'validators' => array(
array(
'name' => 'DoctrineModule\Validator\NoObjectExists',
'options' => array(
'object_repository' => $entityManager->getRepository('Application\Entity\Checkpoints'),
'fields' => 'id'
)
)
)
)
);
}
现在我们知道所提供的 ID 可用于新的 Checkpoints 实体。
关于php - 具有 varchar id 的 Doctrine2 实体不将 id 插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24827268/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我