所以,我正在努力使这个架构工作(顺便说一下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
其中photos
。track_id
= 1和photos
。track_id
不是空限制1)
@foreach($photos as $photo)
{{ $photo->tracks }}
@endforeach
SQLSTATE [42S02]:未找到基表或视图:1146表'iagomarta.photo_track'不存在(SQL:选择tracks
。*,photo_track
。photo_id
as pivot_photo_id
photo_track
track_id
pivot_track_id
来自tracks
内photo_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)
有什么建议吗?
答案 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');
}
想象一下 - '封面艺术'/'照片'代替专辑,所以'专辑'(照片)有很多曲目,所有曲目都属于一张专辑。