Return 来自 eloquent 的 saveMany 以及 parent 数据

Return result from eloquent's saveMany in addition to parent data

在我使用 Eloquent 的方法 saveMany 将数据保存到数据库后 - 我想 return parent datachild data 合而为一 JSON块。问题是在我当前的实现中,我可以 return 一个或另一个,但不能两者兼而有之。最合适、最干净的方法是什么?

我有 2 个模型:

关系是一对多:

final class Theader extends Model 
{
    public $timestamps = false;
    protected $fillable = array('total_amount', 'name', 'description');

    public function lines()
    {
        return $this->hasMany('App\Line', 'header_id');
    }
}

final class Line extends Model 
{
    public $timestamps = false;
    protected $fillable = array('amount', 'description');

    public function theader()
    {
        return $this->belongsTo('App\Theader', 'header_id');
    }
}

当我插入新数据时::

这是我想出的有效解决方案:

namespace App\Http\Controllers;

use App\Theader;
use App\Line;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class TheaderController extends Controller
{   
    public function create(Request $request){
        $input = $request->all();
        $input['name'] = 'My name';
        $input['description'] = 'My description';
        $input['lines'][] = [ 'name' => 'Test 1', 'amount' => 19 ];
        $input['lines'][] = [ 'name' => 'Test 2', 'amount' => 15 ];

        // first create Header
        $header = Theader::create($input);

        // now let's create lines
        $lines = [new Line($input['lines'][0]), new Line($input['lines'][1])];
        $header->lines()->saveMany($lines);

        return response()->json($header);
    }
}

在这个例子中 - 我如何 return header 一次性添加所有新插入的行?

我可以使用 return response()->json($header);return response()->json($header)->lines;,但这些选项 return 都不能同时使用 headerlines

你可以return两行都这样

return response()->json(compact('headers', 'lines')); 

将所有内容都放在一个对象中

$headers->lines = $lines;
$headers->moreStuff = $moreStuff;
return response()->json($headers); 

您只需在保存数据后重新加载 lines 关系。

这应该适合你:

// save your lines to your header
$header->lines()->saveMany($lines);

// load/reload the related lines on the $header object
$header->load('lines');

return response()->json($header);