我有两个模型,其中 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 对它们进行排序,但它将如何与特定方案精确关联。
我有 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) 我遇到了一个问题,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) 我正在创建一个包含文章、标签、评论和点赞的博客。每篇文章都可以有标签、评论和喜欢。当显示所有文章时,我想加载它的用户、标签、评论和喜欢。问题是,点赞与文章存在变形关系,并且不会随文章一起加载。
文章.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)
我怎样才能减少数据库查询?谢谢
我的第一个问题 - 友善点:-)。
在下面的代码中,我尝试引用“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) 我正在对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) 当我使用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) 我正在尝试使用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) 我有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 …
我可以将此代码更改为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) eager-loading ×10
laravel ×2
linq ×2
php ×2
sequelize.js ×2
.net-core ×1
associations ×1
c# ×1
hibernate ×1
hql ×1
inner-join ×1
laravel-4 ×1
laravel-5 ×1
many-to-many ×1
mysql ×1
nhibernate ×1
one-to-many ×1
queryover ×1
subquery ×1