对于Symfony2项目,我必须在博客文章和所谓的平台之间建立关系.平台根据您用于查看站点的域定义特定过滤器.例如:如果您通过url first-example.com加入该网站,该网站将仅提供与此特定平台相关联的博客帖子.
为此,我创建了两个实体Post和Platform.之后我将它们与多对多关系映射在一起.我正试图通过findBy()Doctrines中内置函数的多对多关系来检索数据EntityRepository.
// every one of these methods will throw the same error
$posts = $postRepo->findBy(array('platforms' => array($platform)));
$posts = $postRepo->findByPlatforms($platform);
$posts = $postRepo->findByPlatforms(array($platform));
Run Code Online (Sandbox Code Playgroud)
实体和现有对象$postRepo的正确存储库在哪里.
无论哪种方式:我最终得到以下错误:Post$platformPlatform
ErrorException: Notice: Undefined index: joinColumns in [...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1495
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1495
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1452
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1525
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1018
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:842
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:157
[...]/src/Foobar/BlogBundle/Tests/ORM/PostTest.php:102
Run Code Online (Sandbox Code Playgroud)
是否有可能以这种方式以多对多关系检索相关的entites,或者我被迫自己编写这些函数?奇怪的是:Doctrine不会抛出任何错误:"这不可能.",但是内部E_NOTICE.这就是为什么我认为它应该是可能的,但我在这里错过了一些观点.
剥离到有趣的部分,这两个实体看起来像这样.
<?php
namespace Foobar\CommunityBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
// [...] other namespace stuff
/**
* @ORM\Entity(repositoryClass="Foobar\CommunityBundle\Entity\Repository\PlatformRepository")
* @ORM\Table(name="platforms")
*/
class Platform
{
/** …Run Code Online (Sandbox Code Playgroud) 以下是我的模型:
public class TMUrl
{
//many other properties
//only property with type Keyword
public List<Keyword> Keywords{get;set;}
}
public class Keyword
{
//many other properties
//only property with type TMUrl
public List<TMUrl> Urls{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
很明显,两个实体都有多对多的关系.我选择了流畅的api告诉实体框架关于这种关系,即
modelBuilder.Entity<TMUrl>
.HasMany(s => s.Keywords)
.WithMany(s => s.URLs).Map(s =>
{
s.MapLeftKey("KeywordId");
s.MapRightKey("UrlId");
s.ToTable("KeywordUrlMapping");
});
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
url.Keywords.Add(dbKey); //where url is object of TMUrl,
//dbKey is an existing/new object of Keyword
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我得到例外
An error occurred while saving entities that do not expose foreign key
properties for their relationships.... …Run Code Online (Sandbox Code Playgroud) 假设我在表"table1"和"table2"之间有一个简单的多对多表,它包含两个int字段:"table1-id"和"table2-id".我应该如何索引此链接表?
我曾经只创建一个复合主索引(table1-id,table2-id),但我读到如果更改查询中字段的顺序,则此索引可能不起作用.那么什么是最佳解决方案 - 为没有主索引的每个字段制作独立索引?
谢谢.
我在观看ruby on rails教程时发现了以下表格结构.
table actors
id int 11 primary key auto_increment
name varchar 30
table movies
id int 11 primary key auto_increment
name varchar 30
table actors_movies
actor_id int 11
movie_id int 11
Run Code Online (Sandbox Code Playgroud)
如何查询选择演员参与的电影?
我不是要求rails上的ruby代码.我想要实际的mysql查询字符串.
谢谢!
如何检测ICollection <>属性(多对多关系)的更改?
public class Company
{
...
public virtual ICollection<Employee> Employees { get; set; }
}
using (DataContext context = new DataContext(Properties.Settings.Default.ConnectionString))
{
Company company = context.Companies.First();
company.Employees.Add(context.Employees.First());
context.SaveChanges();
}
public class DataContext : DbContext
{
public override int SaveChanges()
{
return base.SaveChanges();
// Company's entity state is "Unchanged" in this.ChangeTracker
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Microsoft SQL Server Management Studio,在创建联结表时,我应该为联结表创建一个ID列,如果是这样,我还应该将它作为主键和标识列吗?或者只是为我加入多对多关系的表保留2列?
例如,如果这将是多对多表:
MOVIE
Movie_ID
Name
etc...
CATEGORY
Category_ID
Name
etc...
Run Code Online (Sandbox Code Playgroud)
我应该建立联结表:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID
Run Code Online (Sandbox Code Playgroud)
[并制作Movie_Category_Junction_ID我的主键并将其用作标识栏]?
要么:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Run Code Online (Sandbox Code Playgroud)
[并且只留下没有主键或身份表的那个]?
假设我在数据库中有2个表.例如:Dog&Boss这是一个多对多的关系,因为老板可以拥有超过1只狗,而一只狗可以有超过1只拥有者.我是Bobby的老板,但我的妻子也是.
但是很多人不被允许,所以有一个很好的帮助:DogsPerBoss
如何在代码中对此进行建模?
班老板可以拥有一系列狗.Class Dog可以拥有一系列老板. - >至少,这就是我的想法.也许有更好的解决方案?
辅助表中的额外数据怎么样?应该是de Boss级还是Dog级?例如:昵称(我叫狗"好孩子",我的妻子叫他"小狗")
我希望我的问题有点清楚吗?有什么最好的方法来实现这个目标是什么?你能给我一些参考吗?
ORM(如NHibernate)不是一个选项.
如果我有两个具有多对多关系的对象,我通常会在我的数据库模式中使用多对多表对它们进行建模,以将两者关联起来.但是,多对多表(或"连接表")是否有自己的主键(整数自动递增)?
例如,我可能有表A和B,每个表都有一个ID,还有一个名为A_B的表,其外键元组为(A_ID,B_ID).但是A_B是否应该拥有自己的主键自动递增ID列?
添加它有什么优缺点?我个人喜欢用于多对多连接的自然键.但主要关键是增加了什么?
category_product
---------------
id_category
id_product
product
---------------
id_product
id_manufacturer
manufacturer
---------------
id_manufacturer
name
Run Code Online (Sandbox Code Playgroud)
我如何创建一个SQL查询,以便在id_category等于某事时从制造商中选择所有名称?
我有一个模型,MyModel2用ManyToManyField相关的另一种模式MyModel1.
我如何获得对mymodel1.id, mymodel2.id,如Django为这种关系创建的表中所示?我是否必须在此表上执行原始SQL查询,或者是否可以通过此模型的对象管理器进行查询?
class MyModel1(models.Model):
name = models.CharField(max_length=50)
class MyModel2(models.Model):
name = models.CharField(max_length=50)
mymodel1 = models.ManyToManyField(MyModel1)
Run Code Online (Sandbox Code Playgroud)