Laravel Eloquent 坚持 1:n
Posted
技术标签:
【中文标题】Laravel Eloquent 坚持 1:n【英文标题】:Laravel Eloquent persist 1:n 【发布时间】:2021-04-29 17:59:27 【问题描述】:我想为模型创建一个 laravel crud 存储库。该模型具有 1 个 1:n 和 1 个 n:n 的关系。
class Product extends Model
protected $table = 'products';
protected $fillable = [
'description', 'merchantId', 'name', 'link', 'pictureUrl', 'ean', 'brand', 'aktPrice', 'affiliatePortal', 'programId'
];
public function prices()
return $this->hasMany(Price::class);
public function categories()
return $this->hasMany(Categorie::class);
现在我想创建一个存储库,它有一个保存方法和一个用于调用保存方法的 restapi 控制器。我的问题是保存方法应该如何查看实体是否正确保存以及在它工作之前必须完成哪些映射操作。我希望有人可以帮助我,给我一个保存方法,或者我的案例的 crud 存储库,可以帮助我设计控制器。
【问题讨论】:
【参考方案1】:具有所有 crud 操作的控制器如下所示:
<?php
namespace App\Http\Controllers;
use App\Models\Room;
use Illuminate\Http\Request;
class RoomController extends Controller
public function index()
$rooms = Room::all()->toArray();
return $rooms;
public function add(Request $request)
$room = new Room;
$room->create($request->all());
return response()->json('The room successfully added');
public function getById($id)
$room = Room::find($id);
return response()->json($room);
public function update($id, Request $request)
$room = Room::find($id);
$room->update($request->all());
return response()->json('The room successfully updated');
public function delete($id)
$room = Room::find($id);
$room->delete();
return response()->json('The room successfully deleted');
【讨论】:
所以如果我有一个 1:n 的关系并且子实体已经被持久化,那么使用 $room->create($request->all()); 就足够了在数据库中创建实体? 您正在尝试在 Product 路径上创建 Price 和 Category?如果答案是肯定的。那么我给你看的控制器是不够的。您需要调用两个孩子的存储库,这将有自己的保存方法,然后保存。您听说过存储库模式吗?这是一个关于它的链接:asperbrothers.com/blog/implement-repository-pattern-in-laravel.以上是关于Laravel Eloquent 坚持 1:n的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.6和Eloquent将子模型持久化到数据库中,无法从模型中找到hasMany或belongsTo方法
php Laravel 5 Eloquent CheatSheet #laravel #eloquent
php Laravel 5 Eloquent CheatSheet #laravel #eloquent
php Laravel 5 Eloquent CheatSheet #laravel #eloquent
php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法