除了父数据之外,还返回eloquent的saveMany的结果

时间:2017-03-18 19:56:02

标签: php laravel-5 eloquent lumen

使用Eloquent方法saveMany将数据保存到数据库后 - 我希望在parent data中同时返回child dataJSON大块问题是,在我目前的实现中,我可以返回一个或另一个,但不能同时返回。什么是最合适和最干净的方法呢?

我有2个型号:

  • Theader(即标题)
  • Line

关系是一对多:

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');
    }
}

当我插入新数据::

  • 1行转到theaders表。生成唯一id
  • 2到100行将转到lines表。所有人都有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 response()->json($header);return response()->json($header)->lines;,但这两个选项都不会同时返回headerlines

2 个答案:

答案 0 :(得分:1)

你可以像这样返回两行

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

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

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

答案 1 :(得分:1)

您只需在保存数据后重新加载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);