当前位置: 首页 > 知识库问答 >
问题:

不确定我是否正确使用了急切加载,在存在的关系上获取null

郦祺
2023-03-14

我很难回答这个雄辩的问题,希望有人能帮助我。

除了author关系外,查询工作正常,当我知道author和author关系都存在时,它返回null。(数据库中没有没有没有作者的书)

以下是相关代码:

//  BookController.php
$categories = array(1,2,3,4);
$audience_age = 15;

$books = Book::with(array('categories','author'))->whereHas('categories', function($q) use ($categories, $audience_age) 
{
    $q->whereIn('id', $categories)->where('audience_age', '<=', $audience_age)->where('status', '=', 'active');
})->take(50)->get(array('id','data'));


//  Book.php
public function author()
{
    return $this->belongsTo('Author');
}


//  Author.php
public function books()
{
    return $this->hasMany('Book');
}


//  authors migration
Schema::create('authors', function($table)
{
    $table->increments('id');
    $table->string('name');
    $table->string('status');
    $table->timestamps();
    $table->softDeletes();
});         


//  books migration
Schema::create('books', function($table)
{
    $table->increments('id');
    $table->integer('author_id')->unsigned();
    $table->foreign('author_id')->references('id')->on('authors');
    $table->string('name');
    $table->text('data');
    $table->string('status');
    $table->timestamps();
    $table->softDeletes();
});

我通过选择一个特定的Book(ID#40)验证了该关系是否存在,并分别运行了此查询:

print_r(Book::find(40)->author->toJSON()); 

以这种方式加载时,发现作者没有问题。

我一直在使用我的疯狂googl'in技能几个小时试图弄清楚这一点,但到目前为止什么都没有...

更新--

查看DB::getQueryLog()后,我看到查询中作者的ID设置为0[“query”]=

共有2个答案

涂泰平
2023-03-14

我没有弄清楚如何使用ORM来实现它,但是我能够通过使用DB::raw来实现查询。

如果我发现如何在ORM中工作,我会回来更新我的答案。

现在,我是这样做到的:

$results = DB::select(DB::raw("SELECT b.id, b.data, au.id as author_id, GROUP_CONCAT(c.id) as categories
    FROM books b
    INNER JOIN book_category bc ON bc.book_id = b.id
    INNER JOIN categories c ON c.id = bc.category_id 
    INNER JOIN authors au ON au.id = b.author_id 
    WHERE c.id IN (1,2,3,4) 
    LIMIT 2"));
颜新
2023-03-14

代码的唯一问题是没有获得外键链接书籍作者

$books = Book:: ... ->get(array('id','data'));

这样,Eloquent不知道要查找什么,因此它设置了合理的默认值0

只需将author_id包含在选择中:

$books = Book:: ... ->get(array('id', 'data', 'author_id'));

它将按预期工作。

 类似资料:
  • 我想添加创建者字段到我的所有实体的授权目的。以前我有一个OneToOne关系从每个实体到用户实体,但现在我看到它添加了约束到该表,最终用户不能创建一个以上的记录这确实是,但问题是,你必须添加一个相应的字段到用户为每一个实体你创建。数字类型和左连接每次获取用户是获取,但增加了太多的维护负担。所以,在TypeORM中是否有任何内置的解决方案来添加一个字段创建者到我的实体与用户类型,也有选项急切加载它在

  • 我有一个JLabel,随着JFrame窗口的扩展,字体大小会自动改变。JLabel中的文本可以缩写,也可以放入全文,如下所示: 因为我对Swing使用了Eclipse的“AbsoluteLayout”(),所以JLabels不会自动调整到文本的大小,而是固定值。请注意,我确实会随着窗口大小的改变而改变这些固定值。我已经有了一个算法。 我想知道是否有一种方法来确定我的文本是否会显示成这样,而不是进行

  • 让CriteriaQuery加载多对一个关系而不明确地告诉它,我遇到了一些麻烦,而且要在查询中复制我的实体注释来使其工作,这似乎很奇怪: 除其他字段外,“我的实体计算机”包含以下关系: @ManyToOne(fetch=FetchType.Eage)@JoinColumn(name=“Employee”,nullable=false)private Employee=Null; 据我所知,当我加载

  • 问题内容: 我正在创建一个小型Java Jpanel游戏,其中应该有一个火箭,它通过箭头上下移动,并通过太空射击。 触发方法应按以下方式工作:按下空格键,东西触发并在屏幕上移动,然后当它碰到某个x时,它就会消失。此外,您只能发射一次,直到另一颗子弹消失为止。 我不知道我在做什么错。首先,在我的代码启动后,您会看到子弹在屏幕上飞舞。 2,子弹没有消失。 第三,即使其他子弹仍然可见,它也允许我再次开火

  • 在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?

  • 使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。