Laravel 使用 Eloquent 的多对多关系
Laravel many to many relationship using Eloquent
我正在尝试使用 Laravel 创建多对多关系,但我卡住了。
这是我当前的 table 型号:
专辑
album_id
name
created_at
user_image
user_image_id
value
albumxuser_image(结table)
albumxuser_image_id (primary key & auto increment)
album_id (FK from album)
user_image_id (FK from user_image)
我希望能够从 albumxuser_imagetable 中获取专辑名称。
这是我到目前为止所做的。
Album.php 型号
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(因为在练习所以没用view)
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'];
}
这是我得到的错误
Call to undefined method Illuminate\Database\Eloquent\Collection::AlbumxUserImage()
您正在尝试对 Collection
个模型而不是每个单独的模型调用 AlbumxUserImage()
。
AlbumxUserImage::all()
返回 Collection
个模型,您可以将其视为一个数组。您需要遍历集合并在集合中的每个模型上调用 AlbumxUserImage()
。
这可能暂时解决了您的问题,但您似乎不了解 many-to-many relationships 在 Laravel 中的工作原理。
你应该如何做多对多
我不知道为什么你有一个模型作为你的枢轴 table。这不是 Laravel 通常处理具有多对多关系的模型的方式。与您的 table 的典型多对多关系如下所示:
型号:
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');
}
}
用法:
// 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 创建多对多关系,但我卡住了。
这是我当前的 table 型号:
专辑
album_id
name
created_at
user_image
user_image_id
value
albumxuser_image(结table)
albumxuser_image_id (primary key & auto increment)
album_id (FK from album)
user_image_id (FK from user_image)
我希望能够从 albumxuser_imagetable 中获取专辑名称。
这是我到目前为止所做的。
Album.php 型号
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(因为在练习所以没用view)
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'];
}
这是我得到的错误
Call to undefined method Illuminate\Database\Eloquent\Collection::AlbumxUserImage()
您正在尝试对 Collection
个模型而不是每个单独的模型调用 AlbumxUserImage()
。
AlbumxUserImage::all()
返回 Collection
个模型,您可以将其视为一个数组。您需要遍历集合并在集合中的每个模型上调用 AlbumxUserImage()
。
这可能暂时解决了您的问题,但您似乎不了解 many-to-many relationships 在 Laravel 中的工作原理。
你应该如何做多对多
我不知道为什么你有一个模型作为你的枢轴 table。这不是 Laravel 通常处理具有多对多关系的模型的方式。与您的 table 的典型多对多关系如下所示:
型号:
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');
}
}
用法:
// 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;
}
}