标签: eager-loading

Rails 从关联中获取所有内容,包括最后一行

我有两个模型,其中 has_many 属于关系。

Scheme has_many navs
Run Code Online (Sandbox Code Playgroud)

我需要获取仅具有最后导航值的所有方案。我有 10 个方案,每个方案都有大约 100k 导航,但我只需要最后一条记录,即当前值。

通过急切加载将加载所有导航

Scheme.all.includes(:navs)
Run Code Online (Sandbox Code Playgroud)

如何在急切加载时应用条件以仅获取每个方案的最后一行导航。

使用日志更新

如果我跑

Scheme.includes(:current_nav).limit(3)
Run Code Online (Sandbox Code Playgroud)

这些是 AR 执行的查询

SELECT  `schemes`.* FROM `schemes`  LIMIT 3
SELECT `navs`.* FROM `navs`  WHERE `navs`.`schemeCode` IN ('D04', 'D01', 'D30')  ORDER BY id DESC
Run Code Online (Sandbox Code Playgroud)

第二个查询是如何工作的,它将获取所有其 schemaCode 属于 list 的导航,并按 id DESC 对它们进行排序,但它将如何与特定方案精确关联。

ruby-on-rails associations eager-loading ruby-on-rails-4

1
推荐指数
1
解决办法
1281
查看次数

Laravel 4 > 急切加载 > orderBy 嵌套关系

我有 3 个模型

1 - 画廊

class Gallery extends \Eloquent {

    public function media()
    {
        return $this->hasMany('Media');
    }

}
Run Code Online (Sandbox Code Playgroud)

2- 媒体

class Media extends \Eloquent {

    protected $table = 'media';

    public function labels()
    {
        return $this->belongsTo('Label');
    }

}
Run Code Online (Sandbox Code Playgroud)

3 - 标签

class Label extends \Eloquent {

    public function media()
    {
        return $this->hasMany('Media');
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试加载包含所有媒体的特定图库。媒体应按相关标签分组并按标签名称列排序。

这不起作用:

$gallery = Gallery::with( [ 'media.labels' => function( $q )
{
    $q->orderBy( 'name', 'desc' );

} ] )->where( 'name', 'Gallery1' )->first();
Run Code Online (Sandbox Code Playgroud)

举例说明如何对输出进行排序:

Gallery1
    ALabel
        Media1 …
Run Code Online (Sandbox Code Playgroud)

eager-loading laravel-4

1
推荐指数
1
解决办法
2741
查看次数

Sequelize 使用急切加载的模型创建子查询的顶级

我遇到了一个问题,Sequelize 创建主模型的子查询,然后将包含与该子查询连接起来,而不是直接与主模型表连接。包含的查询条件最终位于子查询的 WHERE 子句中,这使其无效。我已经缩短了名字,希望能保持这种紧凑,而不会丢失任何相关信息。

环境:Nodejs: 6.11.3 Sequelize: 3.23.6 => 更新到 4.38.1 问题依旧 MySql: 5.7.23

代码截图模型:

I.model:
   models.I.hasMany(models.II);
   models.I.belongsTo(models.CJ);
   models.I.belongsTo(models.CJS);
II.model:
   models.II.belongsTo(models.I);
CJ.model:
   models.CJ.hasMany(models.I);
   models.CJ.hasMany(models.CJS);
CJS.model:
    models.CJS.hasMany(models.I);
Run Code Online (Sandbox Code Playgroud)

代码片段查询定义:

let where = { cId: '2',
iAmt: { '$gt': 0 },
'$or': 
 [ { '$CJ.a1$': {$like: '%246%'}} },
   { '$CJ.a2$': {$like: '%246%'} },
   { '$I.cPN$': {$like: '%246%'} } 
 ] };

 let query = {
   where: where,
   order: orderBy,
   distinct: true,
   offset: offset,
   limit: limit,
   include: [
   {
    model: CJ, 
    as: 'CJ',
    required: false …
Run Code Online (Sandbox Code Playgroud)

subquery eager-loading sequelize.js

1
推荐指数
1
解决办法
1274
查看次数

Laravel 8.0 如何在使用 MorphTo - MorphMany 关系时进行预加载

我正在创建一个包含文章、标签、评论和点赞的博客。每篇文章都可以有标签、评论和喜欢。当显示所有文章时,我想加载它的用户、标签、评论和喜欢。问题是,点赞与文章存在变形关系,并且不会随文章一起加载。

文章.php

public function likes(): MorphMany
{
    return $this->morphMany(Like::class, 'likeable');
}
Run Code Online (Sandbox Code Playgroud)

点赞.php

public function likeable(): MorphTo
{
    return $this->morphTo();
}
Run Code Online (Sandbox Code Playgroud)

2021_01_26_090103_create_likes_table.php

public function up()
{
    Schema::create('likes', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id');
        $table->morphs('likeable');
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}
Run Code Online (Sandbox Code Playgroud)

文章控制器.php

public function index()
{
    $articles = Article::with(['user', 'tags', 'comments', 'likes'])->latest()->paginate(10);

    return view('articles.all-articles', compact('articles'));
}
Run Code Online (Sandbox Code Playgroud)

但是 Telegram 会报告这些数据库查询:

我怎样才能减少数据库查询?谢谢

php eager-loading laravel

1
推荐指数
1
解决办法
1949
查看次数

.Net Core Entity Framework .Include Eager load 不加载实体

我的第一个问题 - 友善点:-)。

在下面的代码中,我尝试引用“Include(d)”实体(Schedules)来获取其 Name 属性。在 EF 6 中,“schedule”和“schedule_2”都返回正确的 Name 值。在 EF Core 中,“schedule”返回 NULL,“schedule_2”返回正确的 Name 值。

我不明白为什么我必须加载“时间表”列表。.Ininclude 是否不应该强制为每个选举强制加载时间表,以便每个选举时间表的名称属性可用于“时间表”分配?

// Relevant Model entities in database
//         DbSet<Election> Elections { get; set; }
//
// The following are the related classes defined in the database context...
public class Election
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Schedule> Schedules { get; set; }
}
public class Schedule
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)] …
Run Code Online (Sandbox Code Playgroud)

c# linq eager-loading .net-core

1
推荐指数
1
解决办法
1532
查看次数

Hibernate One to Many渴望不吸引所有数据

我正在对hibernate中的一对多关系做一个急切的负担.父项目被正确拉回,但他们只在子列表中收到一个项目.其中一个父母应该有两个.我运行查询Eclipse spits out,它会得到正确的结果.问题是为什么当一个项目应该有两个时,只有一个项目进入每个列表?

 @OneToMany(mappedBy="badge", fetch=FetchType.EAGER)
     public List<BadgeLevel> getBadgeLevels() {
        return this.badgelevels;
     }
Run Code Online (Sandbox Code Playgroud)

SQL

select
        * 
    from
        ( select
            this_.ID as ID10_2_,
            this_.ACTIVE as ACTIVE10_2_,
            this_.DATECREATED as DATECREA3_10_2_,
            this_.DATEMODIFIED as DATEMODI4_10_2_,
            this_.DESCRIPTION as DESCRIPT5_10_2_,
            this_.ENDDATE as ENDDATE10_2_,
            this_.GLOBAL as GLOBAL10_2_,
            this_.NAME as NAME10_2_,
            this_.PUBLISHDETAILS as PUBLISHD9_10_2_,
            this_.STARTDATE as STARTDATE10_2_,
            (SELECT
                COUNT(*) 
            FROM
                BADGELEVELS bl 
            WHERE
                bl.BADGEID = this_.ID) as formula0_2_,
            badgelevel2_.BADGEID as BADGEID4_,
            badgelevel2_.ID as ID4_,
            badgelevel2_.ID as ID9_0_,
            badgelevel2_.ACTIVE as ACTIVE9_0_,
            badgelevel2_.ASSETID as ASSETID9_0_,
            badgelevel2_.BADGEID as BADGEID9_0_,
            badgelevel2_.DATECREATED as DATECREA3_9_0_, …
Run Code Online (Sandbox Code Playgroud)

hibernate one-to-many eager-loading

0
推荐指数
1
解决办法
7832
查看次数

HQL和Session.Query忽略映射中定义的急切提取

当我使用HQL或Linq(Session.Query)获取内容时,我有一个NHibernate没有使用我的映射配置来急切加载集合的问题.Session.Get和Session.QueryOver正如预期的那样工作.

我正在使用NHibernate 3.2.这是我的产品映射中集合的映射.

<bag name="OrderItems" inverse="true" cascade="none" lazy="false" fetch="join">
  <key column="order_id" />
  <one-to-many class="OrderItem" />
</bag>
Run Code Online (Sandbox Code Playgroud)

从另一边看,映射看起来像这样:

<many-to-one name="Product" class="Product" column="product_id" not-null="true" />
Run Code Online (Sandbox Code Playgroud)

我有4个测试,2个是成功的,2个不是.他们使用Session.SessionFactory.Statistics来跟踪CollectionFetchCount(在1个连接查询中或在单独的查询中选择了OrderItem).目的是在选择产品时选择并加载OrderItem,因为几乎总是访问OrderItems.

LastCreated是对插入数据库的最后一个产品的简单引用.

[Test] /* Success */
public void Accessing_Collection_Using_Session_Get_Results_In_1_Select()
{

    // Get by Id
    var product = Session.Get<Product>(LastCreated.Id);
    var count = product.OrderItems.Count;
    Assert.AreEqual(0,statistics.CollectionFetchCount,"Product collectionfetchcount using Get");
}


[Test] /* Success */
public void Accessing_Collection_Using_Session_QueryOver_Results_In_1_Select()
{

    // Get by Id
    var product = Session.QueryOver<Product>().SingleOrDefault();
    var count = product.OrderItems.Count;
    Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using QueryOver");
}
Run Code Online (Sandbox Code Playgroud)
[Test] /* Fail …
Run Code Online (Sandbox Code Playgroud)

linq nhibernate hql eager-loading queryover

0
推荐指数
1
解决办法
669
查看次数

在预先存在的数据库上定制多对多的热切加载

我正在尝试使用Sequelize设置我现有的Express应用程序.在应用程序中,在用户登录时,我执行查询以尝试获取表示用户的对象以及来自少数几个表的几个关系.我已经使用多对多关系将我的测试下拉到以下最小化表示.

这是我的用户模型(在coffeescript中):

module.exports = (sequelize, DataTypes) ->
  sequelize.define "User",
    id:
      type: DataTypes.INTEGER(11)
      primaryKey: true
      autoIncrement: true

    email:
      type: DataTypes.STRING
      allowNull: false

  ,
    tableName: 'users'
    classMethods:
      associate: (models) ->
        @hasOne models.UserDetail
        @hasMany models.Plan,
          through: models.UserPlan
          foreignKey: 'user_id'
Run Code Online (Sandbox Code Playgroud)

这是我的计划模型:

module.exports = (sequelize, DataTypes) ->
  sequelize.define "Plan",
    id:
      type: DataTypes.INTEGER(11)
      primaryKey: true
      autoIncrement: true

    plan:
      type: DataTypes.STRING
      allowNull: false
  ,
    tableName: 'plans'
    classMethods:
      associate: (models) ->
        @hasMany models.User,
          through: models.UserPlan
          foreignKey: 'plan_id'
Run Code Online (Sandbox Code Playgroud)

而且,这是中间的"通过"表(user_plans):

module.exports = (sequelize, DataTypes) ->
  sequelize.define "UserPlan",
    user_id:
      type: DataTypes.INTEGER(11) …
Run Code Online (Sandbox Code Playgroud)

mysql many-to-many eager-loading sequelize.js

0
推荐指数
1
解决办法
2066
查看次数

如何在1次呼叫中急切加载两级关联?

我有FamilyTree, Node, Comment, & User模特.

这种关系是这样的:

FamilyTree

class FamilyTree < ActiveRecord::Base
  belongs_to :user
  has_many :memberships, dependent: :destroy
  has_many :members, through: :memberships, source: :user, dependent: :destroy
  has_many :nodes, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

Node

class Node < ActiveRecord::Base
  belongs_to :family_tree
  belongs_to :user
  has_many :comments, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

Comment

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :node
end
Run Code Online (Sandbox Code Playgroud)

User

class User < ActiveRecord::Base
  has_one :family_tree, dependent: :destroy
  has_many :memberships, dependent: :destroy
  has_many :nodes, dependent: :destroy
  has_many :comments
end
Run Code Online (Sandbox Code Playgroud)

Membership ## This is …

ruby-on-rails eager-loading ruby-on-rails-4

0
推荐指数
1
解决办法
1267
查看次数

Laravel渴望加载与其他桌子上的连接

我可以将此代码更改为has_many或has_one或...的语法来编写漂亮的代码吗?

\App\User::with(['books' => function ($query) {
    $query->join('locations','books.location_id','=','locations.id')
    ->select([
        'books.*',
        'locations.name as l_name'
    ]);
}])->get()
Run Code Online (Sandbox Code Playgroud)

班级用户:

public function books()
{
    return $this->hasMany(Book::class);
}
Run Code Online (Sandbox Code Playgroud)

php inner-join eager-loading laravel laravel-5

0
推荐指数
1
解决办法
1131
查看次数