Laravel很多到很多关系使用雄辩 [英] Laravel many to many relationship using Eloquent
问题描述
这是我当前的表格模型:
相册
album_id
name
created_at
user_image
user_image_id
值
albumxuser_image(结表)
album_id(来自专辑的FK)
user_image_id(来自user_image的FK)
我想要能够从albumxuser_image表获取相册名称。
这是我迄今为止所做的。
Album.php模型
命名空间App \Models;
使用Illuminate\Database\Eloquent\Model;
类相册扩展模型{
/ **
*模型使用的数据库表。
*
* @var string
* /
protected $ table ='album';
protected $ primaryKey ='album_id';
public function AlbumxUserImage(){
return $ this-> belongsToMany('AlbumxUserImage','albumxuser_image','album_id','user_image_id');
}
}
routes.php(我没有使用视图我正在练习)
Route :: get('all',function(){
$ albumxuserimage = AlbumxUserImage :: all();
foreach($ albumxuserimage-> AlbumxUserImage as $ getthem){
echo $ getthem-> pivot-> name; //我想获取名称列的相册表。
}
});
AlbumxUserImage.php
命名空间App \Models;
使用Illuminate\Database\Eloquent\Model;
class AlbumxUserImage extends Model {
protected $ table ='albumxuser_image';
protected $ primaryKey ='albumxuser_image_id';
/ **
*质量可分配的属性。
*
* @var数组
* /
protected $ fillable = ['album_id','user_image_id'];
}
这是我得到的错误
调用未定义的方法Illuminate\Database\Eloquent\Collection :: AlbumxUserImage()
您正试图在 AlbumxUserImage()
AlbumxUserImage :: all()
正在返回一个 Collection
的模型,您可以将其视为数组。您需要迭代集合,并在集合中的每个模型上调用 AlbumxUserImage()
。
可能会解决你现在的问题,但你似乎不明白多对多关系在Laravel工作。
你应该怎么做多对多
我不知道为什么你有一个模型的你的数据透视表。这不是Laravel如何处理具有多对多关系的模型。与您的表格的典型的多对多关系如下所示:
模型:
class Album extends Model {
protected $ table ='album';
protected $ primaryKey ='album_id';
public function images(){
return $ this-> belongsToMany('App\UserImage','albumxuser_image','album_id','user_image_id');
}
}
class UserImage extends Model {
protected $ table ='user_image';
protected $ primaryKey ='user_image_id';
public function albums(){
return $ this-> belongsToMany('App'\\Album','albumxuser_image','user_image_id','album_id');
}
}
用法: >
//通过UserImage获取所有相册名称
$ userImages = UserImage :: all() ;
foreach($ userImages as $ userImage){
foreach($ userImage-> albums as $ album){
echo $ album-> name;
}
}
//通过相册获取所有图片
$ albums = Album :: all();
foreach($ albums as $ album){
foreach($ album-> images as $ image){
echo $ image-> value;
}
}
I'm trying to create a many to many relationship using Laravel, but I am stuck.
Here's my current table model:
album
album_id
name
created_at
user_image
user_image_id
value
albumxuser_image (junction table)
albumxuser_image_id (primary key & auto increment)
album_id (FK from album)
user_image_id (FK from user_image)
I want to be able to get the album name from albumxuser_image table.
Here's what I've done so far.
Album.php model
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Album extends Model {
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'album';
protected $primaryKey = 'album_id';
public function AlbumxUserImage() {
return $this->belongsToMany('AlbumxUserImage', 'albumxuser_image','album_id','user_image_id');
}
}
routes.php (I didn't use view since I'm making a practice)
Route::get('all', function() {
$albumxuserimage = AlbumxUserImage::all();
foreach ($albumxuserimage->AlbumxUserImage as $getthem) {
echo $getthem->pivot->name; // I want to get the name column of the album table.
}
});
AlbumxUserImage.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class AlbumxUserImage extends Model {
protected $table = 'albumxuser_image';
protected $primaryKey = 'albumxuser_image_id';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['album_id', 'user_image_id'];
}
Here's the error I get
Call to undefined method Illuminate\Database\Eloquent\Collection::AlbumxUserImage()
You're trying to call AlbumxUserImage()
on a Collection
of models instead of on each individual model.
AlbumxUserImage::all()
is returning a Collection
of models, which you can think of as an array. You need to iterate over the collection and call AlbumxUserImage()
on each model in the collection.
That may solve your problem for now, but you seem to not understand how many-to-many relationships work in Laravel.
How you should be doing Many-To-Many
I don't know why you have a model for your pivot table. That is not how Laravel normally handles models with many-to-many relationships. A typical many-to-many relationship with your tables would look like this:
Models:
class Album extends Model {
protected $table = 'album';
protected $primaryKey = 'album_id';
public function images() {
return $this->belongsToMany('App\UserImage', 'albumxuser_image','album_id','user_image_id');
}
}
class UserImage extends Model {
protected $table = 'user_image';
protected $primaryKey = 'user_image_id';
public function albums() {
return $this->belongsToMany('App\Album', 'albumxuser_image','user_image_id','album_id');
}
}
Usage:
// Get all album names through UserImage
$userImages = UserImage::all();
foreach ($userImages as $userImage) {
foreach ($userImage->albums as $album) {
echo $album->name;
}
}
// Get all images through Album
$albums = Album::all();
foreach ($albums as $album) {
foreach ($album->images as $image) {
echo $image->value;
}
}
这篇关于Laravel很多到很多关系使用雄辩的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!