我正在使用paranoia gem 来“软删除”记录。现在,我需要为关联模型立即加载这些记录,其中一些记录可能已被删除。Paranoia 将其添加default_scope到“偏执”模型中:
default_scope :conditions => { :deleted_at => nil }
Run Code Online (Sandbox Code Playgroud)
所以实际上,我有这些(简化的)模型:
class Product
has_many :orders
default_scope :conditions => { :deleted_at => nil }
end
class Order
belongs_to :product
end
Run Code Online (Sandbox Code Playgroud)
我想要实现的是在访问订单时立即加载产品:
Order.includes(:product)
Run Code Online (Sandbox Code Playgroud)
这(来自如何在 Rails3 中的关联关系上使用无作用域?)在这里不起作用:
Product.unscoped { Order.includes(:product) }
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建自定义belongs_to关系来添加条件(如“渴望加载嵌套关联和作用域”),但我找不到删除现有关系的方法(如果可能的话)。
问题:如何防止将默认范围应用于急切加载查询?
如果 SQLAlchemy 中有以下 ORM 设置:
class Foo(Base):
id = Column(Integer, primary_key=True)
status = Column(String)
barId = Column(Integer, ForeignKey("bar.id"))
bar = relationship("Bar", lazy="joined")
class Bar(Base):
id = Column(Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
因此,我希望始终为每个 Foo 对象提供关联的 Bar 对象。我经常将 Foo 对象从会话中分离出来,并继续使用它的值和 Bar 的值。我有时需要更新 Foo 的状态字段。在这种情况下,我创建一个新会话,将 foo 对象添加到会话中并提交它。提交后,与 Foo 对象关联的 Bar 对象将失效,但不会通过提交对 Foo 对象的隐式刷新来重新加载。再次从会话中分离 Foo 对象后,Bar 对象不再可用。我发现解决这个问题的唯一方法是在提交 foo 后显式地预先加载 bar 对象。
工作流程示例:
session = Session()
foo = session.query(Foo).get(id) <-- foo.bar is automatically eager loaded
session.close()
....
session = Session()
session.add(foo)
foo.status = 'done'
session.commit() <-- foo is …Run Code Online (Sandbox Code Playgroud) 我是 Laravel 5.4 的新手,正在从事一些查询操作。现在我已经使用查询生成器创建了一个查询,如下所示:
$view = DB::table('blocks')
->leftjoin('programmes', 'blocks.programme_id', '=', 'programmes.id')
->select('blocks.id', 'blocks.programme_id', 'blocks.name', 'blocks.colour', 'blocks.year', 'programmes.title AS programme');
Run Code Online (Sandbox Code Playgroud)
我还有两个表“日期”和“模块”。每个日期和模块都属于块。
现在我想获取所有带有程序、日期和模块的块。我知道我可以使用 with() 方法来获取所有这些。但根据我对 Laravel 的了解,只有当我有每个表的模型文件并且它们之间有关系时,我才能使用 with() 方法。
但不想使用模型并定义它们之间的关系。我只想知道如何在不创建模型并在模型中定义它们之间的关系的情况下获取包含程序、日期和模块的块数据?还有其他方法可以在没有模型的情况下使用 with() 方法吗?
块日期和模块是有条件的,有时我不想用块获取此表的数据。
请帮我解决这个问题。
使用 Symfony 3.2 和 Doctrine 2.5,我很难理解 fetch "EAGER" 在多对多和多对一关系中应该如何工作。
假设我们有两个实体,用户和站点,以及一个多对多关联:
class User
{
/**
* @ORM\ManyToMany(targetEntity="Site", inversedBy="users", fetch="EAGER")
* @ORM\JoinTable(name="user_site")
*/
private $sites;
}
class Site
{
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="sites")
*/
private $users;
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我只需调用
$users = $this->getDoctrine()->getRepository('CoreBundle:User')->findAll();
Run Code Online (Sandbox Code Playgroud)
我只想在 User 表上看到 1 个查询,并在 Site 表上进行联接,但我得到了 N+1 个查询。我还对多对一关联进行了一些测试,并得到了相同的结果。
我知道我可以使用 DQL 自己进行连接,但我想了解 fetch“EAGER” 的工作原理。
在多对多和多对一关联上获取“EAGER”的预期行为是什么?
这是我的通用存储库:
public class Repository<T> : IRepository<T> where T : BaseEntity
{
private DbContext _dbContext { get; set; }
private DbSet<T> _dbSet { get; set; }
public Repository(DbContext context)
{
this._dbContext = context;
this._dbSet = context.Set<T>();
}
public IQueryable<T> GetAll(params Expression<Func<T, object>>[] includes)
{
IQueryable<T> currentSet = this._dbSet;
foreach (var item in includes)
{
currentSet = currentSet.Include(item);
}
return currentSet;
}
public T Get(Expression<Func<T, bool>> predicated,
params Expression<Func<T, object>>[] includes)
=> this.GetAll(includes).Where(predicated).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
问题是当我使用急切加载来加载问题(包括其答案)时,我无法查询答案的投票。
我发现我收到了这个错误,因为我正在加载一个问题,包括它的答案,并再次包括答案的投票。所以我尝试使用 thenInclude() 来解决这个问题,但我不知道如何将它应用到通用存储库中。
任何帮助真的很感激。
谢谢
我有一个 MySQL 数据库,其中表 Game 有一个 FK 到表 GameStats(Game.GameStatsId -> GameStats.GameStatsId),但在获取游戏时无法加载:
var games = _context.Game.Include(g => g.GameStats).ToList();
Run Code Online (Sandbox Code Playgroud)
当它记录 SQL 查询时,没有 JOIN 完成,而只是一个普通的 SELECT from Game。
但是,我可以在此之后对相关的 GameStats 数据执行显式 Load():
_context.Entry(games[0]).Reference(g => g.GameStats).Load();
Run Code Online (Sandbox Code Playgroud)
..所以我想有些办法。但为什么不Include()工作?我错过了什么?
EF 类是从带有脚手架的现有数据库生成的,我使用的是 Mac。使用 MySql.Data.EntityframeworkCore 6.10.6 并尝试过Pomelo但结果相同。
mysql entity-framework eager-loading .net-core .net-core-2.0
我有这样的关系
因此,必须创建一个数据透视表和一个belongsToMany关系,但我的数据透视表有一些额外的列,例如finished和order
我想要有两种关系,一种是从运动中获取所有步骤,另一种是从运动中获取当前步骤(最后完成的步骤)
我知道如何获得所有步骤
public function steps()
{
return $this->belongsToMany(MovementStep::class, 'movement_movement_steps')
->withPivot('order', 'finished')
->orderBy('pivot_order');
}
Run Code Online (Sandbox Code Playgroud)
但目前的步骤又如何呢?我需要这种关系,但只返回一条记录并能够立即加载它,因为我将其传递给 vue.js
public function current_step()
{
return $this->belongsToMany(MovementStep::class, 'movement_movement_steps')
->withPivot('order', 'finished')
->where('finished', true)
->orderBy('pivot_order', 'desc');
}
Run Code Online (Sandbox Code Playgroud)
请注意,我想在没有额外包的情况下做到这一点
替代解决方案,但带有额外的包: Laravel hasOne 通过数据透视表(不是标记为正确的答案,来自 @cbaconnier 的答案)
我目前正在研究 laravel 框架,但我遇到了一些关系和急切的加载问题。
我有三个模型 A、B 和 C
我有两个关系
默认情况下(使用模型中的 $with 属性):
所以大部分时间我都使用 A 不带 B 和 B 带 C
这是我设置关系方法和急切加载的方式
class A extends Model {
...
protected $with = [];
public function bs() {
return $this->hasMany('App\Models\B');
}
}
class B extends Model {
...
protected $with = ['cs'];
public function cs() {
return $this->hasMany('App\Models\C');
}
public function a() {
return $this->belongsTo('App\Models\A');
}
}
class C extends Model {
...
public function …Run Code Online (Sandbox Code Playgroud) 当我在 Laravel 7.2.0 中执行这段代码时
$news = NewsPost::select('title','slug','category_id', 'image', 'fulltext', 'created_at')->with('category:id,title,slug')->orderBy('created_at', 'desc')->simplePaginate(10);
Run Code Online (Sandbox Code Playgroud)
我页面上有 3 个查询
select `title`, `slug`, `category_id`, `image`, `fulltext`, `created_at` from `news_posts` where `news_posts`.`deleted_at` is null order by `created_at` desc limit 11 offset 0
select `id`, `title`, `slug` from `news_categories` where `news_categories`.`id` in (2, 4)
select * from `news_categories` where 0 = 1
Run Code Online (Sandbox Code Playgroud)
我无法理解上次查询的目的是什么以及意味着什么where 0 = 1
我有一个使用 Angular 6 框架的客户项目。项目中有几个模块,其中 16 个应该是延迟加载的(例如 loadChildren)。
但是当我运行构建进行生产时,其中只有 9 个模块有自己的块,其他 7 个模块与主块(即 main.js)合并,因此这些模块将被急切地加载。
我将一些延迟加载的模块与一些急切加载的模块进行了比较,以找出我做错了什么,但无法发现其中的任何区别。
谁能帮助我理解为什么会发生这种情况以及如何解决它?任何提示将不胜感激。
eager-loading ×10
laravel ×4
eloquent ×3
.net-core ×1
angular ×1
asp.net ×1
bundle ×1
c# ×1
doctrine-orm ×1
laravel-5 ×1
laravel-5.4 ×1
lazy-loading ×1
mysql ×1
ng-modules ×1
orm ×1
python ×1
sqlalchemy ×1
symfony ×1