laravel - Laravel ManyToMany 与单数表名的关系
问题描述
我想在samples和known_origins之间创建 ManyToMany 关系。
在我的公司中,我们的约定是使用单数表名,因此如 https://laravel.com/docs/8.x/eloquent#table-names中所述,我定义:
迁移
Schema::create('v3_sample', function (Blueprint $table) {
$table->increments('id');
$table->string('number_canonical', 6)->unique(); // business key
$table->string('name')->nullable();
};
Schema::create('v3_supposed_origin', function (Blueprint $table) {
$table->increments('id');
$table->integer('location_id')->unsigned(); // from other database
$table->string('description');
});
Schema::create('v3_sample_supposed_origin', function (Blueprint $table) {
$table->increments('id');
$table->integer('sample_id')->unsigned();
$table->foreign('sample_id')->references('id')->on('v3_sample')->onDelete('cascade');
$table->integer('supposed_origin_id')->unsigned();
$table->foreign('supposed_origin_id')->references('id')->on('v3_supposed_origin')->onDelete('cascade');
});
楷模
class Sample extends Model
{
protected $table = 'v3_sample';
public function supposed_origins() {
dd($this);
return $this->belongsToMany('App\SupposedOrigin');
}
}
class SupposedOrigin extends Model
{
protected $table = 'v3_supposed_origin';
public function samples() {
return $this->belongsToMany('App\Sample');
}
}
和控制器
class SampleController extends Controller
{
// […]
public function edit(Request $request, $number_canonical)
{
$sample_record = DB::table('v3_sample')->where('number_canonical', $number_canonical)->first();
$supposed_origins = $sample_record->supposed_origins;
dd($supposed_origins); // returns ErrorException Undefined property: stdClass::$supposed_origins
和SampleController返回ErrorException Undefined property: stdClass::$supposed_origins
由于我有单数表名,因此不遵循将具有单数表名(sample_supposed_origin)的数据透视表定义为复数表名(样本和假定原点而不是我的样本假定原点)的规则!
问题 :
- 单数命名是它找不到关系的原因吗?
- 有没有办法正确指定它?添加数据透视表模型?
附加信息:Laravel Framework 7.28.4、PHP 8.0.3、mariadb Ver 15.1 Distrib 10.1.47-MariaDB
解决方案
您的问题是您使用的是查询生成器,而不是 Eloquent 查询生成器。
DB::table('v3_sample')->where('number_canonical', $number_canonical)->first()
将返回一个表示数据库结果的对象,但它只是一个标准的 PHP 对象。
你要:
Sample::query()->where('number_canonical', $number_canonical)->first()
这将返回一个Sample
模型,您将可以访问所需的关系。
在你的情况下$sample_record->supposed_origins
。
推荐阅读
- ios - 使用 performSegue 时出现奇怪的转换行为
- groovy - 在 camunda dmn 的规则表的输出块中编写代码时如何在 groovy 中转义 $ 符号
- java - 将带有附加节点的 XML 转换为 Java 对象
- java - 调用 api 时出错(类型=不可接受,状态=406)
- android - 带有 RecyclerView Android 的动态标签
- javascript - moment.isoWeekday 不是函数
- css - 不能将 div 排列在另一个之下
- python - 如何将时空数据重塑为 lstm 输入?
- xpages - 通过复合数据上的 getComponent 获取价值
- angular - ngStyle 函数在条件下运行