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

时间:2014-07-23 01:25:25

标签: laravel eloquent

我很难用这个雄辩的查询,并希望有人可以帮助我。

除了作者关系之外,查询工作正常,当我知道作者和关系都存在时,它返回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();
});

我通过挑选特定的书籍ID#40来验证关系确实存在并起作用,并单独运行此查询:

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

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

我一直在使用我疯狂的googl&#39;技能几个小时试图弄清楚这一个但是到目前为止没有任何帮助将会非常感激!

更新 -

在查看DB :: getQueryLog()之后,我看到查询中作者的ID设置为0     [&#34;查询&#34;] =&GT;字符串(55)&#34;从authors中选择*,其中authorsid位于(?)&#34; [&#34;绑定&#34;] =&GT; array(1){[0] =&gt; int(0)}}}

2 个答案:

答案 0 :(得分:1)

代码的唯一问题是没有foreign key关联BookAuthor

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

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

只需将author_id加入select

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

它将按预期工作。

答案 1 :(得分:0)

我没有弄清楚如何使用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"));