创建时使用 laravel 返回模型

Posted

技术标签:

【中文标题】创建时使用 laravel 返回模型【英文标题】:Return model with laravel when it was created 【发布时间】:2018-01-06 08:40:21 【问题描述】:

我需要将一个保存为 json 的新模型发送到前面,但我看不到响应列 organizationid

这是我的模特

class Organization extends Model

    protected $table = "core.organizations";
    protected $fillable = ['description'];
    public $primaryKey = "organizationid";
    public $incrementing = false;
    public $timestamps = false;

这是我的功能

public function saveOrganization(Request $request)
    
        try 
            $description = $request->input('description');
            $organization = new Organization();
            $organization->description = $description;
            $organization->save();
            if (!$organization) 
                throw new \Exception("No se guardo la organizacion");
                       
            return response()->json([
            'organization' => $organization,
            ], 200);
         catch (\Exception $ex) 
            return response()->json([
                'error' => 'Ha ocurrido un error al intentar guardar la organización',
            ], 200);
        
    

这是回应

"organization":"description":"Restobar"

我该怎么办?

谢谢你!!

【问题讨论】:

【参考方案1】:
$savedOrganization = Organization::create(
    [
        'description' => $description
    ]
);

return response()->json([
        'organization' => $savedOrganization,
        ], 200)

而且这段代码没用

if (!$organization) 
    throw new \Exception("No se guardo la organizacion");

【讨论】:

$organization->save() 返回布尔值,老兄。 谢谢,但我看到了相同的响应 "organization":"description":"Restobar"【参考方案2】:

由于您创建了一个新对象,并且没有从数据库中检索到一个对象,因此它所知道的唯一属性就是您设置的属性。

如果您想获取表格中的其余字段,则需要在保存后重新检索对象。

// create the new record.
// this instance will only know about the fields you set.
$organization = Organization::create([
    'description' => $description,
]);

// re-retrieve the instance to get all of the fields in the table.
$organization = $organization->fresh();

【讨论】:

谢谢@patricus !!!,方法fresh() 有效,我在json 响应中看到了organizationid。【参考方案3】:

我在 Laravel 7.x 上注意到的一些事情(以前的版本可能也是如此):

我尝试使用 save 处理新对象的创建和更新,如下所示:

public static function saveAnswers(\stdClass $answers) 
    if($answers->id) 
        $jsonObject = JsonObject::find($answers->id);
     else 
        $jsonObject = new JsonObject();
    
    $jsonObject->fill((array) $answers);
    $jsonObject->user_id = Auth::user()->id;
    return $jsonObject->save();

这导致返回值是布尔值 (true)。我有点困惑,因为我之前曾多次成功地在其他端点上使用过保存和返回。最后我发现返回 $jsonObject->save() 总是返回布尔值,但只返回 $jsonObject AFTER SAVING 返回变异对象!所以基本上在单独的命令上保存和返回对象:

$jsonObject->save();
return $jsonObject;

不知道这是什么巫术,但是在使用 C# 和 JAVA 项目后,我已经习惯于通过管道方法首先改变类实例,最后返回类实例......可能是 php 处理了这个工作流程有点不同。

【讨论】:

以上是关于创建时使用 laravel 返回模型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 模型 - 如果数据库表不存在则返回 null

如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?

Laravel 类型提示,模型保存时 id 返回 null

Laravel:每当我返回一个模型时,总是返回一个与它的关系

Laravel 5 Model Inheritance - 获取子模式时返回父数据

是否可以向 Laravel 模型添加非持久属性?