【问题标题】:Belongs to relation with a json column in laravel与laravel中的一个json列属于关系
【发布时间】:2020-12-17 20:47:45
【问题描述】:

这是一个很棒的包: https://github.com/staudenmeir/eloquent-json-relations 但我不能 使其工作与几天的斗争。让我解释一下我的情况 和我的方法。

orders 表有名为sender_address 的json 类型列,其值如下:

{
  "title":"office",
  "street":"Mohakhali Flyover",
  "lat":"23.7794099",
  "lng":"90.3983494",
  "district":"1",
  "area":"2"
}

我的订单模型定义:

class Order extends Model
{
  use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;
    /**
     * @var string The database table used by the model.
     */
    public $table = 'orders';

    /**
     * @var array Validation rules
     */
    public $rules = [
    ];
    
    protected $casts = [
     "sender_address" => "array"
    ];

    public $belongsTo = [
        'client' => [ '\ItScholarBd\Api\Models\User'],
        'customer' => [ 'ItScholarBd\Order\Models\Customer'],
        'district' => [ 'ItScholarBd\Location\Models\District'],
        'clientArea' => [ '\ItScholarBd\Location\Models\Area','sender_address->area']
      ];
}

用法:

$records   =   Order::with(['client.company','clientArea'])->get();

这里我只想获取与sender_address->area 匹配的\ItScholarBd\Location\Models\Area 数据。但是$records显示如下数据:

Array
(
    [0] => Array
        (
            [id] => 1
            [number] => AWB2000001
            [sender_address] => Array
                (
                    [title] => office
                    [street] => Mohakhali Flyover
                    [lat] => 23.7794099
                    [lng] => 90.3983494
                    [district] => 1
                    [area] => 2
                )

            [client_id] => 309
      
            [client] => Array
                (
                    [id] => 309
                    [name] => client
                    [email] => client@gmail.com
                    [password] => $2y$10$BIQgKvOV4h0lWOO66W6CC.rCEnFB6c6mBCh3WF2t1eDFueEJmgb7y
                    [activation_code] => 
                    [persist_code] => $2y$10$1Njt/420DYIyW3azOYh9z./WwURdgFf.7JKCGE0jqjTQmBPK/nmSe
                    [reset_password_code] => 
                    [permissions] => 
                    [is_activated] => 1
                    [activated_at] => 2020-11-27 18:41:04
                    [last_login] => 2020-12-17 13:50:48
                    [created_at] => 2020-11-27 18:41:04
                    [updated_at] => 2020-12-17 13:50:48
                    [username] => client
                    [surname] => 
                    [deleted_at] => 
                    [last_seen] => 2020-12-17 16:55:42
                    [is_guest] => 0
                    [is_superuser] => 0
                    [phone] => 
                    [company] => Array
                        (
                            [id] => 4
                            [name] => Bracnect  Academy
                            [email] => academy@bracnet.net
                            [url] => https://academy.bracnet.net/
                            [phone] => 01708006884
                            [alt_phone] => 01709007885
                            [address] => mohakhali
                            [product_type] => Course
                            [created_at] => 2020-12-02 16:20:54
                            [updated_at] => 2020-12-02 16:22:23
                            [code] => bracnectacademy
                        )
                )

            [client_area] => 
        )

)

这里的 client_area 是空的。但是我将存在id = 2 的记录的区域表加倍。我的方法有什么问题?我在这个问题上苦苦挣扎了 2 天。有什么想法吗?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    我从未见过任何人以这种方式定义关系,也没有在文档中找到它:

    public $belongsTo = [
             'client' => [ '\ItScholarBd\Api\Models\User'],
             'customer' => [ 'ItScholarBd\Order\Models\Customer'],
             'district' => [ 'ItScholarBd\Location\Models\District'],
             'clientArea' => [ '\ItScholarBd\Location\Models\Area','sender_address->area']
           ];
    

    我想如果你这样定义关系:

    public function clientArea(){
      return $this->belongsTo('\ItScholarBd\Location\Models\Area', 'sender_address->area');
    }
    

    它应该可以工作。

    别忘了在 Area 模型中使用 HasJsonRelationships trait。

    【讨论】:

    • 非常感谢亲爱的。我该如何应用这种关系?是 Order::with(['client.company'])-clientArea()->get(); ?
    • Order::with(['client.company', 'clientArea''])->get().您需要添加关系函数名称。请检查此语句的返回值是什么:Order::find(1)->clientArea.
    猜你喜欢
    • 2021-12-15
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2021-12-10
    • 2021-03-17
    相关资源
    最近更新 更多