Laravel有一个属于他们的关系吗?

时间:2015-09-18 16:54:48

标签: php laravel-5.1

所以,我正在努力使这个架构工作(顺便说一下laravel总新手......)我有一个'照片'表和一个音频'轨道'表,我希望能够做一些事情像这样:

跟踪模型:

// Get the photo associated with this track.
public function cover_art() {
    return $this->hasOne('App\Photo');
}

照片模特:

// Get all the tracks associated with this photo.  
public function tracks() {
    return $this->belongsToMany('App\Track');
}

表示此关系的最佳解决方案是什么(音轨只能有一张照片,而照片可以属于多个曲目)?

好吧,最后我设置了一切,我得到了预期的错误:

照片表:

Schema::create('photos', function (Blueprint $table) {
    $table->increments('id');
    $table->string('path');
    $table->string('filename');
    $table->string('original_filename');
    $table->boolean('is_cover')->default(false);
    $table->string('title');
    $table->string('slug')->unique();
    $table->string('caption')->nullable();
    $table->timestamps();
});

曲目表:

Schema::create('tracks', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('photo_id')->unsigned()->nullable();
    $table->string('path');
    $table->string('filename');
    $table->string('original_filename');
    $table->string('title');
    $table->string('slug')->unique();
    $table->string('caption')->nullable();
    $table->timestamps();
    $table->foreign('photo_id')->references('id')->on('photos')->onDelete('set null');
});

所以现在,例如,当我在视图或控制器中调用适当的方法时,我会收到以下错误:

@foreach($tracks as $track)
    {{ $track->cover_art }}
@endforeach

SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'photos.track_id'(SQL:select * from photos其中photostrack_id = 1和photostrack_id不是空限制1)

@foreach($photos as $photo)
    {{ $photo->tracks }}
@endforeach

SQLSTATE [42S02]:未找到基表或视图:1146表'iagomarta.photo_track'不存在(SQL:选择tracks。*,photo_trackphoto_id as pivot_photo_id photo_track track_id pivot_track_id来自tracksphoto_track tracks id photo_track track_id {1}}。photo_track其中photo_id.circle { $diameter: 50px; @include transform(translate(-15px, -15px)); border-radius: 50%; height: $diameter; left: 50%; position: absolute; top: 20%; width: $diameter; } = 1)

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

也许它只是如下所示的拼写错误:

create_table_tracks_migration:

Schema::create('tracks', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('photo_id')->unsigned();
    $table->string('path');
    $table->string('filename');
    $table->string('original_filename');
    $table->string('title');
    $table->string('slug')->unique();
    $table->string('caption')->nullable();
    $table->timestamps();
});

Schema::table('tracks', function(Blueprint $table)
        {
            $table->foreign('photo_id')
                ->references('id')
                ->on('photos')
                ->onDelete('cascade');
        });

通常最好的方法是以这种方式设置外键引用,因为我自己遇到了一些问题而没有这样做。

另一方面,我真的不喜欢创建可以为空的外键,因为它可能会造成巨大的混乱。

同样奇怪的是错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'photos.track_id' in 'where clause' (SQL: select * from photos where photos.track_id = 1 and photos.track_id is not null limit 1)

无论如何,你不应该在你的照片桌上有一个track_id列。

除此之外,您可以尝试设置belongsTo(App \ Photo)关系而不是hasOne。它可以工作,因为一个轨道只能有一张照片。此外,您不需要数据透视表,因为它是一对多关系,而不是多对多关系。

答案 1 :(得分:0)

// Track Model
public function cover_art() {
    return $this->belongsTo('App\Photo');
}

// Photo Model
public function tracks() {
    return $this->hasMany('App\Track');
}

想象一下 - '封面艺术'/'照片'代替专辑,所以'专辑'(照片)有很多曲目,所有曲目都属于一张专辑。