最近我使用 Hackalode 设计了一个数据库模型或 ERD。所以我目前面临的问题是,根据我当前的设计,我无法按照我的意愿正确查询它。我用 MYSQL 研究了 ERD,确实知道 Mongo 的工作方式不一样
这个想法很简单,我想要一个包含一系列成分列表的食谱,并且这些成分来自单独的集合。配方还包括成分的测量,即。(1汤匙糖)
还可以从配料表中查询,找到包含该配料的菜谱
我希望这个集合处于多对多关系,并且配方可以使用数据库中已有的成分。
我只是不知道如何查询数据
我通过使用 $elemMatch 和 populate 尝试了很多方法,结果我得到的只是空数组列表。
我期待两种类型的查询,我可以按成分名称或配方进行查询
我的预期结果是这样的
[{
id: ...,
name: ....,
description: ...,
macros: [...],
ingredients: [
{
id,
amount: ....,
unit: ....
ingredient: {
id: ....,
name: ....
}
}
}, { ... }]
Run Code Online (Sandbox Code Playgroud)
但不是得到
[]
Run Code Online (Sandbox Code Playgroud) 我的项目中有以下模型:
class Topping(models.Model):
name = models.CharField(max_length=255)
class Pizza(models.Model):
name = models.CharField(max_length=255)
toppings = models.ManyToManyField(Topping, blank=True)
def save(self, *args, **kwargs):
print('Saving...')
if self.pk:
for topping in self.toppings.all():
print(topping.name)
super(Pizza, self).save(*args, **kwargs)
def toppings_changed(sender, instance, **kwargs):
instance.save()
m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
Run Code Online (Sandbox Code Playgroud)
基本上,每当toppings发生变化时,都会触发信号。信号所做的只是调用Pizza对象的 save 方法。无论如何,假设我有三个对象:
pizza = Pizza.objects.get(pk=1) # Number of toppings is 0
topping1 = Topping.objects.get(pk=1)
topping2 = Topping.objects.get(pk=2)
Run Code Online (Sandbox Code Playgroud)
现在,我想将这两种配料添加到我的披萨中。我使用以下代码执行此操作:
pizza = Pizza.objects.get(pk=1)
pizza.toppings.set([1, 2])
Run Code Online (Sandbox Code Playgroud)
配料设置正确,但是,披萨的 save 方法被调用两次,因为 m2m_changed 信号被调用两次,因为发生了两次更改。在提交所有更改后,如何才能仅调用一次?为了澄清,我希望添加两种配料,但我只想在所有更改结束时触发一次信号。谢谢你的帮助。
一个产品可以有许多其他相关产品。以下内容完美地创建了联接表,但是当我将一个产品添加到另一个产品的相关产品时,我在保存时收到以下错误:“尝试保存更改时,‘ProductAssociation.ProductID’的值未知。” 这是因为该属性也是外键的一部分,而关系中的主要实体是未知的。
modelBuilder.Entity<Product>()
.HasMany(x => x.RelatedProducts)
.WithMany(r => r.RelatedProducts)
.UsingEntity<ProductAssociation>(
x => x.HasOne(p => p.RelatedProduct).WithMany().HasForeignKey(f => f.RelatedProductID),
x => x.HasOne(p => p.Product).WithMany().HasForeignKey(f => f.ProductID).OnDelete(DeleteBehavior.NoAction),
x => x.ToTable("ProductAssociations"));
Run Code Online (Sandbox Code Playgroud) 我有以下型号:
class Project(models.Model):
project_name = models.CharField(max_length=50)
project_users = models.ManyToManyField('Users.UserAccount', related_name='project_users', blank=True)
....
class UserAccount(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=30, unique=True)
....
class Discipline(models.Model):
name = models.CharField(unique=True, max_length=27, choices=discipline_choices)
Run Code Online (Sandbox Code Playgroud)
的数据库表project_users如下所示:
*--------*----------------*---------------------*
| ID | project_id | user_account_id |
*--------*----------------*---------------------*
Run Code Online (Sandbox Code Playgroud)
我想在project_users字段/表中与Discipline模型建立额外的关系。这在 Django 中可能吗?我一直在研究Django 中的中介多关系,但这并不是我想要的。在我的应用程序中,有一定数量的学科,我想要实现的是在单个项目中为每个用户提供多个学科。所以像这样:
*--------*----------------*---------------------*-------------------*
| ID | project_id | user_account_id | discipline_id |
*--------*----------------*---------------------*-------------------*
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我的表中存在多对多关系的问题,这是在培训中心工作的员工和讲师之间.我找不到它们之间的联系,我不知道如何得到它.员工字段是:
教师领域是
我在保存对数据库的更改方面存在问题,我正在使用LINQ2SQL映射.我已经基于以下教程实现了M:M关系(User <= UserRole => Role):http://www.codeproject.com/KB/linq/linqtutorial2.aspx#premain25
当我使用一个继承自DataContext并负责我所有域类的类时,一切正常,例如:
[数据库]公共类BookCatalog:DataContext {//创建静态DataContext以删除M:M Join记录私有静态DataContext contextForRemovedRecords = null;
public BookCatalog() : base("Data Source=KO2\\SQLSERVER;Initial Catalog=Katalog;Integrated Security=True") { }
public Table<User> Users;
public Table<Role> Roles;
public Table<UserRole> UserRoles;
public static void RemoveRecord<T>(T recordToRemove) where T : class
{
// Use the static contextForRemovedRecords
if (contextForRemovedRecords == null)
contextForRemovedRecords = new BookCatalog();
Table<T> tableData = contextForRemovedRecords.GetTable<T>();
var deleteRecord = tableData.SingleOrDefault(record => record == recordToRemove);
if (deleteRecord != null)
{
tableData.DeleteOnSubmit(deleteRecord);
}
}
// NEW method (not …Run Code Online (Sandbox Code Playgroud) 我正在使用Grails,我希望有一个单向的多对多关系.
在我的应用程序中,员工可以"标记"另一个员工,以便快速访问它们以留下笔记.员工无需知道谁为他们添加了书签.
换句话说,我基本上想拥有一个employee.bookmarks可以用于此的属性.
我在mysql中3个表artists tracks,并artist_tracks
和我做了什么是写在这个 aricle.
这是表artist:artist_id,artist_name
tracks:track_id,track_name
artist_tracks: artist_id,track_id
我怎样才能防止artist_tracks表中的重复行?
嗨,我有同样的问题:与额外字段的多对多自我关系?但是我找不到答案:/我先尝试了ManyToOne和其他网站OneToMany ...但后来我无法使用类似的东西
public function hasFriend(User $user)
{
return $this->myFriends->contains($user);
}
Run Code Online (Sandbox Code Playgroud)
因为有一些这个问题:
This function is called, taking a User type $user variable and you then use the contains() function on $this->myFriends.
Run Code Online (Sandbox Code Playgroud)
$ this-> myFriends是一个请求的ArrayCollection(与User不同的类型)和关于contains()的doctrine文档:
The comparison of two elements is strict, that means not only the value but also the type must match.
Run Code Online (Sandbox Code Playgroud)
那么用额外的字段解决这个ManyToMany关系的最佳方法是什么?或者,如果我回去设置onetomany和manytoone关系,我怎么能修改hasFriend方法?例如,检查ID是否在ID的数组集合中.
编辑:我有这张桌子...我需要的是:1.选择我的朋友......和我的粉丝......检查我是不是和他在一起.(因为他可以和我成为朋友,我不必和他在一起......就像在推特上一样).我可以做很多事,但我需要额外的字段,如:"查看""他订阅我的时间",你可以在我的桌子上看到.
并进行这样的查询,然后能够在树枝检查if(app.user.hasFriend(follower)或类似的东西)
$qb = $this->createQueryBuilder('r')
->select('u')
->innerJoin('UserBundle:User', 'u')
->Where('r.friend_id=:id')
->setParameter('id', $id)
->orderBy('r.time', 'DESC')
->setMaxResults(50);
return $qb->getQuery()
->getResult();
Run Code Online (Sandbox Code Playgroud)

我开始学习sf2,非常酷,因为我的问题我有两个表:
媒体
/**
* @ORM\ManyToMany(targetEntity="Test\SiteBundle\Entity\Website", inversedBy="medias")
* @ORM\JoinTable(name="media_website")
private $websites;
Run Code Online (Sandbox Code Playgroud)
和网站
/**
* @ORM\ManyToMany(targetEntity="Test\SiteBundle\Entity\Media", mappedBy="websites")
private $medias;
Run Code Online (Sandbox Code Playgroud)
在我的MediaType.php中我有这个:
$builder
->add('title')
->add('website', 'entity', array(
'class' => 'TestSiteBundle:Website',
'property' => 'name',
'query_builder' => function(WebsiteRepository $er)use($user_id) {
return $er->getMyWebsites($user_id);
},
'multiple'=>false))
Run Code Online (Sandbox Code Playgroud)
最后,在枝条页面中我有这个:
<div class="form-group">
{{ form_label(form.description, "Description", { 'label_attr': {'class': 'control-label col-md-2'} }) }}
<div class="col-md-5">
{{ form_widget(form.description, { 'attr': {'class': 'form-control'} }) }}
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
当我尝试添加媒体时出现此错误:
Neither the property "websites" nor one of the methods "setWebsites()", "__set()" or "__call()" exist and …Run Code Online (Sandbox Code Playgroud) many-to-many ×10
database ×2
django ×2
orm ×2
symfony ×2
asp.net-mvc ×1
django-orm ×1
doctrine-orm ×1
erd ×1
grails ×1
grails-orm ×1
groovy ×1
linq ×1
mongodb ×1
mysql ×1
python ×1