我尝试在我的数据库中创建不同表之间的关系,并从这些表中获取数据,但我得到了一个错误:属性不存在于此集合实例。
这是我的代码:
迁移文件:
Schema::table('books', function (Blueprint $table) {
$table->foreignId('author_id')->constrained('authors')->onUpdate('cascade')->onDelete('cascade');
});
在模型作者:
public function books () {
return $this->hasMany('AppModelsBooks');
}
在模型书:
public function author() {
return $this->belongsTo('AppModelsAuthors');
}
在AuthorsController:
public function index () {
$authors = Authors::all();
return dd($authors->books);
}
在BooksController:
public function index () {
$books = Books::all();
return dd($books->author);
}
如果有人有办法解决这个问题,我将非常感激。
你的模型是正确的,但是当你调用$authors->books时你错了,因为$authors是你的authors模型的集合,而不是Author的对象。如果你想检查你们的关系,你可以用这个例子:
public function index () {
$authors = Authors::latest()->first();;
dd($authors->books);
}
如果你想让所有的作者都有他们的书,使用急切加载with()
public function index () {
$authors = Authors::with('books')->get();
return dd($authors);
}
如果您想要所有带有各自作者的书
public function index () {
$books = Books::with('author')->get();
return dd($books);
}
当您迭代刀片中的集合(如数组)时,您可以访问关系
@foreach($books as $book)
<span>{{$book->author->name}}</span>
@endforeach
如果你只想获得一个作者的书籍列表,你可以这样做
public function index () {
$authors = Authors::all();
// $authors is a collection of models (think of it as an advanced array)
// To get one of the models, you can iterate them with a loop or, for example, take the first one with "->first()"
//$authors->first() is an instance of the model "Author" class
return dd($authors->first()->books);
// $authors->first()->books is now a collection of models of "Book" class
}
您的Author和books之间的关系是一对多的,因此AuthorhasMany
books(就像您在模型关系中正确声明的那样)
this的输出是一个集合,所以你不能以这种方式访问它,而是需要像这样循环:
public function index () {
$authors = Authors::all();
$authors->books->each(function ($book) {
print_r($book);
}
}
如果您想检索单个Author的图书,您可以为Author返回单个模型实例,如:
public function index () {
$author = Authors::where('id',1)->first();
print_r($author->books);
}
谢谢大家!在我的例子中,正确的解决方案是:
在模型:
public function author() { return $this->belongsTo('AppModelsAuthors', 'author_id'); }
And in controller:
$books = Books::with('author')->get();
在视图文件中我添加了:
@foreach
<li>{{ $book->title}}</li>
<li>{{ $book->author->name}}</li>
@endforeach
再次感谢你。主题可以关闭)))))