Laravel使用Eloquent进行多对多的关系

sal*_*lep 3 php laravel eloquent laravel-5.1

我正在尝试使用Laravel建立多对多的关系,但我被困住了.

这是我目前的表格模型:

专辑

album_id
name
created_at
Run Code Online (Sandbox Code Playgroud)

user_image

user_image_id
value
Run Code Online (Sandbox Code Playgroud)

albumxuser_image(联结表)

albumxuser_image_id (primary key & auto increment)
album_id (FK from album)
user_image_id (FK from user_image)
Run Code Online (Sandbox Code Playgroud)

我希望能够从albumxuser_image表中获取相册名称.

这是我到目前为止所做的.

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

routes.php(因为我正在练习,所以我没有使用视图)

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.
    }
});
Run Code Online (Sandbox Code Playgroud)

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'];
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

Call to undefined method Illuminate\Database\Eloquent\Collection::AlbumxUserImage()
Run Code Online (Sandbox Code Playgroud)

Bro*_*ary 9

你试图调用AlbumxUserImage()Collection的模型,而不是对每一款车型.

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)