我在这里看到了很多答案,这些答案与Doctrine 2.1中严重缺乏功能有关,这可能是OOP正确性胜过关系理智的结果.
我有两个表与多对一的关系,文章和成员.会员可以发表许多文章.拥有方的注释是
/**
* @var \Member
* @ORM\ManyToOne(targetEntity="Member")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="member_id", referencedColumnName="id")
* })
*/
private $member;
Run Code Online (Sandbox Code Playgroud)
我想获得成员6的所有活动文章,这是一个简单的SQL查询:
SELECT * FROM mbr_article
WHERE active = 1 AND member_id = 6
ORDER BY article_id DESC
Run Code Online (Sandbox Code Playgroud)
我最终得到的是
$rep = $this->getDoctrine()->getRepository('SMWMemberBundle:Article');
$q = $rep->createQueryBuilder('a')
->leftJoin('a.member','m')
->where('m.id = ?1')
->andWhere('a.active = 1')
->orderBy('a.id', 'DESC')
->setParameter(1, $id)
->getQuery();
Run Code Online (Sandbox Code Playgroud)
哪个产生了
SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2,
m0_.content AS content3, m0_.member_id AS member_id4
FROM mbr_article m0_
LEFT JOIN mbr_member m1_ ON …
Run Code Online (Sandbox Code Playgroud) 我有3个实体:
[Member] ----OneToMany----> [MemberCategory] ---ManyToOne---> [Category]
Run Code Online (Sandbox Code Playgroud)
这对于从数据库中获取结果很有效,但是我无法使表单生成器构建正确的表单控件.
我想要一个包含复选框的所有类别的列表,这些复选框会针对成员使用的类别进行检查.最终我想添加优先级字段.
会员
class Member
{
protected $id;
@ORM\OneToMany(targetEntity="MemberCategory", mappedBy="member")
protected $categories;
}
Run Code Online (Sandbox Code Playgroud)
类别
class Category
{
protected $id;
@ORM\Column(name="category_name", type="string", length=50, nullable=false, unique=true)
private $categoryName;
}
Run Code Online (Sandbox Code Playgroud)
MemberCategory
class MemberCategory
{
@ORM\Id
@ORM\ManyToOne(targetEntity="Member")
@ORM\JoinColumns({
@ORM\JoinColumn(name="member_id", referencedColumnName="id", onDelete="CASCADE")
private $member;
@ORM\Id
@ORM\ManyToOne(targetEntity="Category")
@ORM\JoinColumns({
@ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")
private $category;
@ORM\Column(name="priority", type="integer", nullable=true)
protected $priority;
}
Run Code Online (Sandbox Code Playgroud)
使用表单生成器的明显尝试无效.
如果我使用:
$builder->add('categories', 'entity', array(
'class' => 'SMWMemberBundle:Category',
'property' => 'categoryName',
'multiple' => true,
'expanded' => true,
'required' => false
)); …
Run Code Online (Sandbox Code Playgroud) 我喜欢FTP和SFTP的Panic Transmit客户端,但由于文件列表被缓存而无法轻松刷新,因此丢失了几次工作.
"视图"菜单中的"刷新"选项仅刷新当前目录,而不执行子目录.
我已经联系了恐慌,并得到了回复,说明它的工作方式,他们想改变它,但不是在这个版本中.我已经尝试了其他几个FTP客户端,发现它们缺乏,例如.Fetch只显示远程端并使用Finder作为本地端,这很快就会让人感到困惑.
有谁知道Transmit保存文件列表的缓存,以便我可以删除它并获得完全刷新?
如果没有,它将通过SCP,RSYNC和命令行FTP回到未来.
我正在使用内置的Webrick服务器在我的localhost:3000上的生产环境中测试我的Rails 4应用程序.当我运行RAILS_ENV=production bundle exec rake assets:precompile
资产时,公共重建资产并重建清单,但页面仍然使用以前的资产名称.
重新启动rails服务器会显示新资产.是否有一种不那么极端的方法来实现这一点,当我将其移植到运行Phusion Passenger的生产服务器时,这将如何表现.我真的不想重启Apache以使我的资产处于正常状态.
我一直在寻找一种编写基于生成器的Python迭代器的好方法.我发现了很多关于迭代器主题的教程,很多关于生成器和yield语句的教程,但没有结合这两者的内容.我已经构建了一个有效的小例子,并想知道是否有更好的方法来做到这一点.
class myIterator :
def __init__(self, n) :
self.last = n
self.myGen = self.myGenerator()
def __iter__(self) :
return self.myGenerator()
def next(self) :
return self.myGen.next()
def myGenerator(self) :
prev = 0
fib = 1
while fib < self.last :
res = fib
yield res
fib = fib + prev
prev = res
raise StopIteration
Run Code Online (Sandbox Code Playgroud)
我在真实世界的程序中使用了这种技术,可以在我的Github存储库中的SQLStatements.py中找到
最令人困惑的部分是定义next()函数.显而易见的解决方案在每次调用时都返回了第一个元素.存储包含生成器的实例变量有效,但似乎是一个kludge.
如果你知道一个更好的方法来做这个或一个涵盖这个主题的好教程,请告诉我.
编辑:@MartijnPieters发布的第三个例子完全解决了这个问题.保存self.next中的self.generator.next函数提供了下一个函数.我希望这有助于其他人试图解决这个问题.