使用SQLAlchemy 0.7.1和MySQL 5.1数据库,我建立了多对多关系,如下所示:
user_groups = Table('user_groups', Base.metadata,
Column('user_id', String(128), ForeignKey('users.username')),
Column('group_id', Integer, ForeignKey('groups.id'))
)
class ZKUser(Base, ZKTableAudit):
__tablename__ = 'users'
username = Column(String(128), primary_key=True)
first_name = Column(String(512))
last_name = Column(String(512))
groups = relationship(ZKGroup, secondary=user_groups, backref='users')
class ZKGroup(Base, ZKTableAudit):
__tablename__ = 'groups'
id = Column(Integer, primary_key=True)
name = Column(String(512))
Run Code Online (Sandbox Code Playgroud)
用户可以属于多个组,而组可以包含多个用户.
我正在尝试做的是构建一个SQLAlchemy查询,该查询仅返回属于组列表中至少一个组的用户.
我玩这个in_函数,但这似乎只适用于测试列表中成员资格的标量值.我不是一个SQL编写者,所以我甚至不知道SELECT这需要什么样的声明.
使用Laravel,我有以下代码
$review = Review::find(1);
$review->delete();
Run Code Online (Sandbox Code Playgroud)
Review具有与Product实体定义的多对多关系.当我删除评论时,我希望它与数据透视表中的相关产品分离,但事实并非如此.当我运行上面的代码时,我仍然看到数据透视表中的链接行.
我在这里错过了什么或者这是Laravel的工作方式吗?我知道这个detach()方法,但我认为删除一个实体也会自动将它从任何相关实体中分离出来.
Review 定义如下:
<?php
class Review extends Eloquent
{
public function products()
{
return $this->belongsToMany('Product');
}
}
Run Code Online (Sandbox Code Playgroud)
Product 定义如下:
<?php
class Product extends Eloquent
{
public function reviews()
{
return $this->belongsToMany('Review');
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
例如,我有3个类,我用它们用于多对多关系:
public class Library
{
[Key]
public string LibraryId { get; set; }
public List<Library2Book> Library2Books { get; set; }
}
public class Book
{
[Key]
public string BookId { get; set; }
public List<Library2Book> Library2Books { get; set; }
}
public class Library2Book
{
public string BookId { get; set; }
public Book Book { get; set; }
public string LibraryId { get; set; }
public Library Library { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
它们配置为ApplicationDbContext:
protected override void …Run Code Online (Sandbox Code Playgroud) 以下是我的模型设置的片段:
class Profile(models.Model):
name = models.CharField(max_length=32)
accout = models.ManyToManyField(
'project.Account',
through='project.ProfileAccount'
)
def __unicode__(self)
return self.name
class Accounts(models.Model):
name = models.CharField(max_length=32)
type = models.CharField(max_length=32)
class Meta:
ordering = ('name',)
def __unicode__(self)
return self.name
class ProfileAccounts(models.Model):
profile = models.ForeignKey('project.Profile')
account = models.ForeignKey('project.Accounts')
number = models.PositiveIntegerField()
class Meta:
ordering = ('number',)
Run Code Online (Sandbox Code Playgroud)
然后,当我访问帐户时,如何在中间ProfileAccounts模型中按"数字"排序,而不是在帐户模型中使用默认的"名称"?
for acct_number in self.profile.accounts.all():
pass
Run Code Online (Sandbox Code Playgroud)
这不起作用,但是我希望它如何访问这些数据的要点:
for scanline_field in self.scanline_profile.fields.all().order_by('number'):
pass
Run Code Online (Sandbox Code Playgroud) 我有三个模型:产品,用户和评论.
审核与产品和用户相关联,如下所示:
class Review(models.Model):
product = models.ForeignKey(Product)
user = models.ForeignKey(User)
review_text = models.TextField()
creation_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
我想允许每个用户每个产品只提交一次评论.推荐的方法是什么?通过模型,通过验证,还是其他什么?我是Django/Python的新手.谢谢.
我在我的数据库3个表:Students,Courses和Students_Courses
学生可以有多门课程,课程可以有多个学生.之间存在许多一对多的关系Students和Courses.
我有3个案例用于我的项目,课程已添加到我的Courses表格中.
User_Courses- 再次,预期的行为.Students和Students_Courses,但它也删除Courses其中不需要的记录.即使我在课程中没有任何用户,我也希望课程能够在那里.下面是我的表和注释类的代码.
CREATE TABLE `Students` (
`StudentID` INT(11) NOT NULL AUTO_INCREMENT,
`StudentName` VARCHAR(50) NOT NULL
PRIMARY KEY (`StudentID`)
)
CREATE TABLE `Courses` (
`CourseID` INT(11) NOT NULL AUTO_INCREMENT,
`CourseName` VARCHAR(50) NOT NULL
PRIMARY KEY (`CourseID`)
)
CREATE TABLE `Student_Courses` (
`StudentId` INT(10) NOT NULL DEFAULT '0',
`CourseID` INT(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`StudentId`, …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用Entity Framework的ChangeTracker进行审计.我正在覆盖DbContext中的SaveChanges()方法,并为已添加,修改或删除的实体创建日志.这是FWIW的代码:
public override int SaveChanges()
{
var validStates = new EntityState[] { EntityState.Added, EntityState.Modified, EntityState.Deleted };
var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseEntity && validStates.Contains(x.State));
var entriesToAudit = new Dictionary<object, EntityState>();
foreach (var entity in entities)
{
entriesToAudit.Add(entity.Entity, entity.State);
}
//Save entries first so the IDs of new records will be populated
var result = base.SaveChanges();
createAuditLogs(entriesToAudit, entityRelationshipsToAudit, changeUserId);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这适用于"普通"实体.但是,对于简单的多对多关系,我必须扩展此实现以包含"独立关联",如此精彩的SO答案中所述,它通过ObjectContext访问更改,如下所示:
private static IEnumerable<EntityRelationship> GetRelationships(this DbContext context, EntityState relationshipState, Func<ObjectStateEntry, int, object> getValue)
{ …Run Code Online (Sandbox Code Playgroud) 我与多对多的关系遇到了一些麻烦.我有Users和Assets.我希望能够将用户分配到资产页面上的资产.
下面的代码显示创建/编辑资产时的用户列表,但是对用户复选框所做的更改不会保存,而其余数据会保留.
如果我通过mysql客户端向users_assets添加条目,则这些更改将显示在资产列表中.
用户
class User extends BaseUser
{
/**
* @ORM\ManyToMany(targetEntity="Asset", inversedBy="users")
*/
private $assets;
}
Run Code Online (Sandbox Code Playgroud)
财富
class Asset
{
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="assets")
*/
private $users;
}
Run Code Online (Sandbox Code Playgroud)
AssetType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$form = $builder
->add('users', null, array(
'expanded' => true,
'multiple' => true
))
->getForm();
return $form;
}
Run Code Online (Sandbox Code Playgroud) 如何在Doctrine 2中设置具有额外列的连接表,或与其他属性的多对多关联?
Artist和之间存在着多对多的关系ArtistType.我可以轻松添加ArtistType如下的艺术家
foreach (var artistType in this._db.ArtistTypes
.Where(artistType => vm.SelectedIds.Contains(artistType.ArtistTypeID)))
{
artist.ArtistTypes.Add(artistType);
}
_db.ArtistDetails.Add(artist);
_db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这将使用正确的映射更新多对多关联表.但是,当我尝试从表中删除任何项目时,我没有得到任何错误,但它没有从表中删除它?
foreach (var artistType in this._db.ArtistTypes
.Where(at => vm.SelectedIds.Contains(at.ArtistTypeID)))
{
artistDetail.ArtistTypes.Remove(artistType);
}
this._db.Entry(artistDetail).State = EntityState.Modified;
this._db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
many-to-many ×10
c# ×3
django ×2
doctrine-orm ×2
python ×2
annotations ×1
dbcontext ×1
eloquent ×1
forms ×1
hibernate ×1
java ×1
jointable ×1
laravel ×1
mysql ×1
orm ×1
properties ×1
sql ×1
sqlalchemy ×1
symfony ×1